« 【メモ】ロックしないでインデックス作成(Informix) | トップページ | 衝撃! InformixでOFFSETまでできるようになってたw »

2014.03.16

PHPpgadmin的なものを作るときの注意点(2)

声を大にして言おう。

pg_class.relfilenode = pg_attribute.attrelid

は間違いだ!

テーブルの情報を抜き出す際に、テーブル情報はpg_class、カラム情報はpg_attributeに格納されている。
その際に良くある間違いが上記の連結方法である。
pg_class.relfilenodeは名前のとおり、ファイルのノード名を表しているものであって、いわば物理情報である。しかるにpg_attribute.attrelidは論理的な情報である。
relfilenodeはalter tableやらなにやらでその値は移ろっていく。
しかし初期作成段階ではこの連結でつながってしまうことから、この結合条件が正しい、としている誤ったSQLはネット上に結構転がっている。

……で、ウチも一回間違えちゃったんだけどねorz
きちんとマニュアルを読めば、pg_attributeのattrelidが参照する先はpg_class.oidだ、とVer7.4のころから明記されている。
pg_class.oidは隠しカラムなので目視できているカラムから探した結果、relfilenodeがそれっぽいため、こうした間違いをする人は後を絶たないらしい。
テーブル情報等は下記のSQLで抜いてねー。

SELECT pg_attribute.attname as colname , format_type(atttypid, atttypmod) as coltype , pg_attribute.attnum as syscolumns_colno , pg_class.relname as tabname , pg_attribute.attrelid as syscolumns_tabid , FROM pg_class INNER JOIN pg_attribute ON pg_class.oid = pg_attribute.attrelid WHERE pg_attribute.attnum > 0 AND pg_attribute.attisdropped IS FALSE;

|

« 【メモ】ロックしないでインデックス作成(Informix) | トップページ | 衝撃! InformixでOFFSETまでできるようになってたw »

コメント

コメントを書く



(ウェブ上には掲載しません)




トラックバック

この記事のトラックバックURL:
http://app.cocolog-nifty.com/t/trackback/2022/59285406

この記事へのトラックバック一覧です: PHPpgadmin的なものを作るときの注意点(2):

« 【メモ】ロックしないでインデックス作成(Informix) | トップページ | 衝撃! InformixでOFFSETまでできるようになってたw »