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の設定。現場では「このテーブルの主キーは〜」とか「プライマリキーは〜」などの会話がなされる