メインコンテンツへスキップ

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 が結果を見る方法です。

例

  1. 行を追加する

Query OK と 1 row affected が報告のすべてです。何が保存されたかを見るには テーブルを問い合わせます。
文は 4 列を指定し、行には 6 列あります。member_id は列が AUTO_INCREMENT なので自分で数え上げ、active はテーブルが宣言する DEFAULT 1 を取りました。

  1. サーバーが選んだ id を読み戻す

AUTO_INCREMENT の値は挿入の間に決まるので、それを知る唯一の方法は尋ねる ことです。挿入を行ったのと同じセッションで尋ねてください。
LAST_INSERT_ID() は自分の接続についてだけ答えるので、混雑したサーバーでも 別のセッションの id を渡されることはありません。新しい接続には答えるものが なく、0 を返します。

ERROR 1062 は行が既にあるという意味

UNIQUE 列は、既に保持している値を持つ 2 つ目の行を拒否します。ここでは email が一意であり、Mary Smith のアドレスは使用済みです。
メッセージは値と、それを拒否したインデックスを名指しします。これで通常は、 本当の重複と、一意にするつもりでそうしなかった列とを区別できます。 Upsert は、これを想定して代わりに既存の行を更新する文です。

ERROR 1364 は必須の列が欠けているという意味

NOT NULL でデフォルトのない列を省略すると、サーバーには書くものが ありません。
一度に 1 列ずつ名指しするので、3 列が欠けている文は 3 回かかります。 DESCRIBE member; でテーブルを読み、Null の下に NO と記され、デフォルトの ないものをすべて与えてください。 NULL を受け入れる列は別の話です。省略すると、行には NULL が入ります。

重複キーでも id は消費される

今 id を問い合わせると、6 が欠けています。
重複キーの試行は失敗する前に 6 を取り、InnoDB はその番号を元に戻しません。 ERROR 1364 の試行は何も取りませんでした。テーブルに届く前に拒否された からです。このような欠番は正常であり、何も失われていません。この列は 識別子として扱い、行数や、番号が途切れなく続くという約束として扱わないで ください。

まとめ

  • 行を追加するには INSERT INTO table (columns) VALUES (values) と書きます。
  • 行そのものではなく、書き込んだ行数が返ります。
  • デフォルトや AUTO_INCREMENT のある列は省略し、サーバーに埋めさせます。
  • ERROR 1062 は、UNIQUE 列が既に持っている値という意味です。
  • ERROR 1364 は、与えなかった必須の列という意味です。
  • AUTO_INCREMENT 列には欠番が出ます。重複キーの失敗が番号を持ったままになるからです。

関連項目

  • 複数行の挿入 — 1 文で多数の行
  • INSERT SELECT — 入力する代わりにクエリから得た行
  • Upsert — 挿入するか、邪魔になっている行を更新する
  • UPDATE — 既にある行を変更する