4-2. write - INSERT文

2001. 1件登録

  • (お客さん)「新しい荷主が増えるので登録してくれないか」
  • (あなた)「そろそろ荷主登録画面作りましょうよ」

データ登録依頼書

name unit_rate contract_date cancellation_date
夙川家具 1.95 2016-03-01 未設定

※idは自動採番、versionは0で設定すること。

回答

insert into owners(
  name, 
  unit_rate, 
  contract_date, 
  cancellation_date, 
  version
) values (
  '夙川家具', 
  1.95, 
  to_date('2016-03-01', 'YYYY-MM-DD'), 
  null,
  0
);

解説

  • insert文で新規データが登録できる
  • カラム名を明示的に指定しなくても書けるが、その場合は全てのカラムに登録値を指定する必要がある。今回はidを自動採番させたかったので、カラム名を明示した。
  • そうでなくても保守運用の観点から、カラム名は書くべき
-- これは実行しなくていいよ
insert into orders values (
  1000, -- IDも設定しないといけない
  '夙川家具', 
  1.95, 
  to_date('2016-03-01', 'YYYY-MM-DD', 
  null,
  0
);
  • 自動採番とは「データベースに自動的に一意な値をつけてもらう」こと。現場では『このカラムは自動採番で〜』とか『オートインクリメントで〜』とかいう会話が飛び交う
  • 一意 = 他と値が被らないという意
  • orders.id カラムはbigserial という型で定義されている。これはPostgreSQLの「特に指定がなければ自動採番しまっせ」型(テーブル定義書を参照のこと)
  • versionカラムは業務的には使わないカラム。システムの中で「楽観的排他制御」のために使う。詳しくは実践編で説明する。

2002. IDの重複

  • (お客さん)「ID1番で新しい荷主を登録してくれないか」
  • (あなた)「ダメですよ。IDは自動採番ですし、すでに1番は御影青果店さんで登録してますから」
  • (お客さん)「上客を捕まえたんや、ダントツなんや。あの客が1番なんや!」
  • (あなた)「無理だっつってんだろ」

データ登録依頼書

id name unit_rate contract_date cancellation_date
1 西宮ビール 2.00 2016-03-10 未設定

※versionは0で設定すること。

回答

-- 実行したらどうなるでしょう
insert into owners(
  id,
  name, 
  unit_rate, 
  contract_date, 
  cancellation_date, 
  version
) values (
  1,
  '西宮ビール', 
  2.00, 
  to_date('2016-03-10', 'YYYY-MM-DD'), 
  null,
  0
);

解説

  • 実行すると「duplicate key value violates unique constraint "owners_pkey"」というエラーが出る。
  • これは「キーが重複しているので登録できねえよ」というエラー
  • owners.idには「主キー制約」が設定してある。
  • 主キー制約は「一意な値を登録しなければならない」というDBの設定。現場では「このテーブルの主キーは〜」とか「プライマリキーは〜」などの会話がなされる

results matching ""

    No results matching ""