VillageSQL is a drop-in replacement for MySQL with extensions.
All examples on this page work on VillageSQL. Install Now →
INSERT はデータを書き
ます。ここから先は文がテーブルの中身を変えるので、チュートリアルの残りは
サンプルデータではなく専用のデータベースで作業します。
練習用データベース
Sakila はすべての読み取りレッスンが説明する基準なので、そのままにして おきます。代わりにその横に小さなデータベースを作り、やり直したいときは いつでもこれをもう一度実行してください。mysql -u root -p sakila_practice でクライアントを開き、レッスンの合間に
このブロックをもう一度実行してください。
INSERT の仕組み
TABLE_NAME を書き込み先のテーブルに、COLUMN_LIST を値を与える列に、
VALUE_LIST をそれらの列 1 つにつき 1 つの値に、同じ順番で置き換えます。
サーバーは行を追加し、何行書いたかを報告します。行そのものは表示しない
ので、その後の SELECT が結果を見る方法です。
例
- 行を追加する
Query OK と 1 row affected が報告のすべてです。何が保存されたかを見るには
テーブルを問い合わせます。
member_id は列が
AUTO_INCREMENT なので自分で数え上げ、active はテーブルが宣言する
DEFAULT 1 を取りました。
- サーバーが選んだ id を読み戻す
AUTO_INCREMENT の値は挿入の間に決まるので、それを知る唯一の方法は尋ねる
ことです。挿入を行ったのと同じセッションで尋ねてください。
LAST_INSERT_ID() は自分の接続についてだけ答えるので、混雑したサーバーでも
別のセッションの id を渡されることはありません。新しい接続には答えるものが
なく、0 を返します。
ERROR 1062 は行が既にあるという意味
UNIQUE 列は、既に保持している値を持つ 2 つ目の行を拒否します。ここでは
email が一意であり、Mary Smith のアドレスは使用済みです。
ERROR 1364 は必須の列が欠けているという意味
NOT NULL でデフォルトのない列を省略すると、サーバーには書くものが
ありません。
DESCRIBE member; でテーブルを読み、Null の下に NO と記され、デフォルトの
ないものをすべて与えてください。
NULL を受け入れる列は別の話です。省略すると、行には NULL が入ります。
重複キーでも id は消費される
今 id を問い合わせると、6 が欠けています。ERROR 1364 の試行は何も取りませんでした。テーブルに届く前に拒否された
からです。このような欠番は正常であり、何も失われていません。この列は
識別子として扱い、行数や、番号が途切れなく続くという約束として扱わないで
ください。
まとめ
- 行を追加するには
INSERT INTO table (columns) VALUES (values)と書きます。 - 行そのものではなく、書き込んだ行数が返ります。
- デフォルトや
AUTO_INCREMENTのある列は省略し、サーバーに埋めさせます。 ERROR 1062は、UNIQUE列が既に持っている値という意味です。ERROR 1364は、与えなかった必須の列という意味です。AUTO_INCREMENT列には欠番が出ます。重複キーの失敗が番号を持ったままになるからです。
関連項目
- 複数行の挿入 — 1 文で多数の行
- INSERT SELECT — 入力する代わりにクエリから得た行
- Upsert — 挿入するか、邪魔になっている行を更新する
- UPDATE — 既にある行を変更する