PhpPgAdminって便利ですよね。
でも、私はたまに以下のことを感じていました。
各レコードの編集/削除が出来るときと出来ないときがある。
この違いなんだ?
そこでタイミングよく、敏腕上司が教えてくれました。
上司「主キーがあればレコード識別ができるから、GUIで編集/削除できる」
私「すんごい!本当だー!しらなかったー!さすが●●さん!」
ちょっと考えると、当たり前のことだなと理解しましたwww
上司「ブログのネタにできるね」
以上、こんな会話がありました。早速ネタにします。
ありがとう●●さん。
そこで自分でいろいろ試してみました。
参考:https://www.postgresql.jp/document/9.4/html/ddl-constraints.html
その前に、、、
データベースは整合性を保つための整合性制約があります。
<整合性制約>
・一意性制約(ユニーク制約)
・参照制約(外部キー制約)
・非NULL制約(NOT NULL制約)
の3つがあります。
私「主キーはユニークだから一意性制約か!じゃあ、uniquであればいいのか!」
いつも通り、先走る私。
CREATE TABLE id_unique_table( id integer UNIQUE, name text ); INSERT INTO id_unique_table VALUES(1, test1); INSERT INTO id_unique_table VALUES(2, test2); INSERT INTO id_unique_table VALUES(3, test3); INSERT INTO id_unique_table VALUES(NULL, 'null');
一意性制約のマーク(「1」)が付いています
ん?
id=NULLのところは編集/削除できんやーん><
ってことは….NOT NULLも必要なのか!
さっきのCREATE TABLE文に非NULL制約を追加
CREATE TABLE id_not_null_unique_table( id integer UNIQUE NOT NULL, name text ); INSERT INTO id_not_null_unique_table VALUES(1, 'test1'); INSERT INTO id_not_null_unique_table VALUES(2, 'test2'); INSERT INTO id_not_null_unique_table VALUES(3, 'test3');
※INSERT INTO id_not_null_unique_table
VALUES(null, ‘null’); は非NULL制約に反するためINSERTできませんでした。
想定通り、非NULL制約が追加されました。
私「なるほど。id=NULLのレコードが複数あったらレコードを識別できない。
ってことは、主キーは一意性制約と非NULL制約が必要なんだ!」
つまり、
CREATE TABLE テーブル( id integer UNIQUE NOT NULL, name text );
と
CREATE TABLE テーブル( id integer PRIMARY KEY, name text );
は同じ!
試しに、後者を実行。
PRIMARY KEY宣言したら、勝手にNOT NULLが入ってた!
ユニークでNOT NULLじゃないと、
そりゃー誰でも識別できんですわ。