HHeLiBeXの日記 正道編

日々の記憶の記録とメモ‥

PostgreSQL

Zend Framework 1+PostgreSQL

ある時、Zend Framework 1系+PostgreSQLで組まれたシステムのPostgreSQLバージョンアップを行う機会があったのだけど、PostgreSQL 12以降には上げられないことが判明して、PostgreSQL 11で妥協したことがあった。 CentOS 6のサポート期限も近づいているし、…

yumで標準以外のPostgreSQL環境を構築する

PostgreSQLはバージョンアップが早く、CentOSの標準リポジトリのみに依存していると、本家でEOLになっていって悲しいので、yumで新しいバージョンのPostgreSQL環境を構築するためのメモ。 ちなみに、CentOS 6ではv8.4.20、CentOS 7ではv9.2.24、CentOS 8では…

ARRAY_TO_STRINGの結果に対してLIKE検索している部分が遅い問題の一つの解決案

割と複雑なクエリで4秒とか掛かるものにぶち当たり、explainを取ってみたところ、表題の通りARRAY_TO_STRINGした結果得られる文字列に対するLIKE検索をしている部分でコストが増大していることが分かり、軽く検証してみたメモ。 細かいところは追い追い書い…

PostgreSQLサーバー用ディレクトリを暗号化ファイルシステムに置き換えてみる~論理ボリューム作成編

前置き やりたいことは、前に書いた PostgreSQLサーバー用ディレクトリを暗号化ファイルシステムに置き換えてみる - HHeLiBeXの日記 正道編 と同じなのだが、 HDDを追加せずに、論理ボリュームlv_rootを分割して、片方を論理ボリュームlv_pgsqlとして暗号化…

PostgreSQLサーバー用ディレクトリを暗号化ファイルシステムに置き換えてみる

前置き とりあえず、以下の環境を前提としている。 OSはCentOS 6 (VirtualBoxのVMとして作成) PostgreSQL 8.4をパッケージインストールしている データディレクトリは「/var/lib/pgsql/data」 PostgreSQLのデータディレクトリも含めて1つのパーティションに…

bytea型でバイナリデータを扱う際のワナ

やはり自称DB屋(何)としては、DBMSのことを書かないと始まらないだろうということで(謎) PHPプログラムからPostgreSQLにいわゆるバイナリデータを放り込んでいろいろやる必要が生じたので、ちょっと調べてみると、主に以下の2通りがあるらしい。 bytea型の列…

SQLExceptionから取得できるSQLSTATEとエラーコード

ふとjava.sql.SQLExceptionのJavaDocを見ていたら、SQLSTATEとベンダー固有のエラーコードを取得できることに(いまさら)気づいた。 ベンダー固有のエラーコードはログに吐き出すくらいしか用途を思いつかないが、SQLSTATEはある程度規格化されているはずなの…

LIMITの限界に挑戦

以下のエントリで、各構文のサポート状況について書いた。 指定した範囲の行を取得するクエリ - HHeLiBeXの日記 正道編 この中のLIMIT/OFFSETで不思議な挙動を示したものがあったり、どこまでいけるんだろうと思ったりしたので、調子に乗って(謎)、LIMITに指…

指定した範囲の行を取得するクエリ

DB2 Express-C v9.7.2のWindows版で使えていたLIMIT/OFFSETが同Linux版で使えなくて、プラットフォームによって違うのかと思ってしまい、同等のことができる構文をいろいろと調べた挙句、インストール直後の設定が違っていただけという。 で、せっかくなので…

シーケンスの情報の取得

ふと、PostgreSQLでシーケンスの情報を取得する必要ができたので調べてみたらしい。そもそもPostgreSQLにおけるシーケンスは、CREATE SEQUENCE文を使って自分で定義するか、SERIAL(SERIAL4)型やBIGSERIAL(SERIAL8)型の列を含むテーブルの作成によって自動的…

文字列型とマルチバイト文字

MySQLで、何も考えずに「VARCHAR(n)」な列に日本語n文字を格納しようとしたら格納できてしまい、DB2での記憶と違うということで一通り調べてみたらしい。作ったテーブルは次のとおり。 CREATE TABLE tbl1(str CHAR(6) NOT NULL) CREATE TABLE tbl2(str NCHAR…

テーブル名や列名の別名の指定

はじめに - SQL標準規格では SQL標準規格によると、SQL文ではテーブル名や列名の別名を次のように指定することができることになっている。(いずれも、キーワード AS は省略可能) SELECT t.col2 [AS] c2 FROM tbl [AS] t WHERE t.col1 = 1 UPDATE tbl [AS] t …

CURRENT_TIMESTAMPをTIMESTAMP型の列のデフォルト値に指定してみる

一見するとなんてことはない。 つまりは次のようなテーブル定義をするということ。 CREATE TABLE xxx( id INT NOT NULL , ts1 TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP , ts2 TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP ) 2つのタイムスタンプを必…

文字列の連結

SQLにおける文字列連結は「縦棒2本(||)」という自分の中の常識が打ち破られたらしい。 ということで、次のテーブルを前提として調査してみた。 CREATE TABLE hoge( v1 VARCHAR(4) NOT NULL , v2 VARCHAR(4) NOT NULL , v3 VARCHAR(4) NOT NULL , v4 VARCHAR(…

列名を持たない列の列名(意味不明)

なんと言えばいいのか分からなかったので意味不明なタイトルになったが、要は次のようなクエリを実行したときの結果表の列名はどうなるのか、ということ。 SELECT COUNT(*) FROM hoge ということで、一通り調べてみた。 次のテーブルを前提とする。 CREATE T…

xx_fetch_array()関数の恐怖

いや、まぁ恐怖ってほどのことでもないのだけど。 こんなクエリ(何)書かないだろうし。 select table_schema as "1", table_name as "2", column_name as "3" from information_schema.columns where table_schema = 'information_schema' and table_name = …

PHP実行環境改変メモ

だいぶ前に自宅のPCにPHP実行環境を構築してから、そのままの環境でいろいろと試してきたのだが、そろそろちゃんと整備する必要が出てきたので、設定回りをきちんとしていくことにしたらしい。 ということで、以前構築した環境をベースに、ちょっと改変を加…

各DBMSで日付型の値から曜日を取り出す

最初、PostgreSQLでdate_part関数を使用している処理があって、それをMySQLではどう書けばいいかというのを調べたことから始まったのだが。 手始めに次のブログを見つけた。 馬場誠Blog(東京都世田谷区経堂のWebクリエイター)» ブログアーカイブ » MySQLで…

PostgreSQLでidentity column

以前に書いたidentity columnに関する記事(identity column - テーブルの各行にシーケンス番号を割り当てる - HHeLiBeXの日記 正道編)のPostgreSQL版。 SERIAL型やBIGSERIAL型を使用すればいいらしい。(正確には、SERIALやBIGSERIALはデータ型ではないらしい…

テーブルの制約の規定に使用されている列の取得

ある制約を規定するのに使用されている列を取得するには、KEY_COLUMN_USAGEというビューを使用することができる。 PostgreSQL v8.4で次のようなクエリを発行する: SELECT * FROM INFORMATION_SCHEMA.KEY_COLUMN_USAGE WHERE TABLE_SCHEMA = 'public' ORDER …

テーブルの制約一覧の取得

おもむろに次のようなテーブルを作ってみる。 CREATE TABLE hoge( col1 INT NOT NULL , col2 INT NOT NULL , CONSTRAINT pkey_hoge PRIMARY KEY(col1, col2) ) ; CREATE TABLE foo( col1 INT NOT NULL , col2 INT NOT NULL , col3 INT NOT NULL , col4 INT N…

TIMESTAMP のリテラル

TIMESTAMP のリテラルを記述する際に、DB2 で苦労した記憶が唐突によみがえってきたので、手元にある DBMS を比べてみた。 IBM DB2 Express-C v9.1.2 IBM DB2 Express-C v9.5.2 IBM DB2 Express-C v9.7.0 Oracle Database 10g Express Edition PostgreSQL v8…

情報スキーマ-列名の取得

以下のエントリで、識別子の大文字/小文字について触れた。 識別子の大文字と小文字の違い - HHeLiBeXの日記 正道編 で、列名の情報がどう格納されているのかについてまとめてみる。 実行してみるクエリは、各DBMSについて以下のようなものになる。 表の生成…

識別子の大文字と小文字の違い

時々、CREATE TABLE文を書くときには CREATE TABLE "HOGE"("ID" INTEGER, "NAME" VARCHAR(8)) のように書くのに、INSERT文では INSERT INTO HOGE(ID, NAME) VALUES(12345678, 'hhelibex') のように書いている、というケースを見かける。 確かに、SQLでは、テ…

SQLの比較演算子

唐突に、「プログラム言語を学んだ後でSQLを学ぶと、"not equal"を"!="と書きたくなる人が多いんじゃないか」、「SQLでは"<>"」と考えたところで、どこかの実装で"!="が使えたものがあったような記憶がよみがえってきた。 そこで、次の本を参照してみた。SQL…

CREATE FUNCTION文による関数定義

PostgreSQL v8.3でCREATE FUNCTION文を使って関数を定義したいだけなのに、えらく苦労してしまったので、メモ。 PL/pgSQLを使って関数を定義するための準備 シェルで以下のようなコマンドを実行する。(以下の例はWindowsのコマンドプロンプトの場合) CD /D <PostgreSQLインストールフォルダ>\</postgresqlインストールフォルダ>…