MariaDB講座 / INSERTで一行・複数行のデータを追加する

INSERTは表に新しい行を追加します。保存先の列を明示し、VALUESの括弧内の値を同じ順番で並べ、実行後は追加件数と保存された値の両方を確認します。

列の順序と値を対応させる

値は意味ではなく列リストの位置に対応します。価格と在庫はどちらも数値でも、順番を逆にすると違う内容になります。列名を省略すると表全体の列順に依存するため、構造変更にも気づきやすい明示的な列リストを使います。

文字列は単引用符、数値には通貨記号や桁区切りを付けず、欠損は文字列'NULL'ではなくNULLです。引用符は'O''Brien'のように二重にできますが、外部入力はSQL文字列へ連結せず、パラメーター化クエリーを使います。列の定義はCREATE TABLEで確認します。

一行と複数行を追加する

SQLファイルの実行方法でcourse_userとして学習サーバーへ接続し、SELECT VERSION(), DATABASE();とSHOW TABLES;で対象を確認します。通常例はUTF-8の.sqlファイルで実行できます。同名の実習表がある場合は定義と行を調べ、必要なデータを保存してから判断します。既存のアプリケーション表を置き換えません。

最初のINSERTは一行、次は五行です。比較用の初期IDを明示しています。

USE shopcourse;
CREATE TABLE products_13_lab (
  product_id INT NOT NULL AUTO_INCREMENT,
  product_name VARCHAR(100) NOT NULL,
  category VARCHAR(30) NOT NULL,
  price DECIMAL(10,2) NOT NULL,
  stock INT NOT NULL DEFAULT 0,
  note VARCHAR(100) NULL DEFAULT NULL,
  PRIMARY KEY (product_id),
  CONSTRAINT ck_p13_price CHECK (price >= 0),
  CONSTRAINT ck_p13_stock CHECK (stock >= 0)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;
INSERT INTO products_13_lab
  (product_id, product_name, category, price, stock, note)
VALUES (1, '노트', '문구', 3500.00, 20, NULL);
SELECT ROW_COUNT() AS inserted_rows;
INSERT INTO products_13_lab
  (product_id, product_name, category, price, stock, note)
VALUES
  (2, '볼펜', '문구', 1500.00, 0, ''),
  (3, '머그컵', '생활', 8000.00, 12, '선물 포장'),
  (4, '스탠드', '생활', 25000.00, 5, NULL),
  (5, '파일', '문구', 1500.00, 50, ''),
  (6, '케이블', '전자', 8000.00, 0, '호환 확인');
SELECT ROW_COUNT() AS inserted_rows;

SQLの文字列はUTF-8実習の条件をそろえるため、原文の韓国語サンプルを維持しています。ID1~6はノート、ペン、マグカップ、スタンドライト、ファイル、ケーブルです。分類は文具・生活用品・電子用品で、結果はIDと数値を基準に照合できます。ファイルはUTF-8、接続もutf8mb4を使ってください。

直後のROW_COUNT()は1と5です。他のSQLを実行すると「直前の文」が変わるため、書き込み直後に読みます。autocommitが有効なら二つのINSERTは別々に確定し、二つ目の失敗が一つ目を自動取消するとは限りません。

保存値を読み直す

成功メッセージだけでなく、列と値を読みます。

SELECT product_id, product_name, category, price, stock, note FROM products_13_lab ORDER BY product_id;

ID1~6の価格は3500、1500、8000、25000、1500、8000、在庫は20、0、12、5、50、0です。noteは1と4がNULL、2と5が空文字、3が贈答包装、6が互換性の確認です。表示が似る場合はnote IS NULLで区別します。文字化けなら再追加する前にファイルと通信の文字コードを調べます。

自動採番と省略時の値を調べる

次の全体を同じ接続で実行します。

START TRANSACTION;
INSERT INTO products_13_lab (product_name, category, price)
VALUES ('연습 상품', '문구', 2000.00);
SELECT LAST_INSERT_ID() AS generated_id;
SELECT product_id, stock, note IS NULL AS note_is_null
FROM products_13_lab WHERE product_id = LAST_INSERT_ID();
ROLLBACK;
SELECT COUNT(*) AS remaining_rows FROM products_13_lab;

初期状態のままなら生成IDは7で、stockは既定0、note_is_nullは1です。過去の失敗などで採番が進んでいれば、値7に固執せず実際のLAST_INSERT_ID()を読みます。ROLLBACK後の件数は6ですが、番号が再利用される保証はありません。明示的なNULLと列の省略は既定値の規則でも区別します。

不正な入力を個別に試す

以下の三文は通常ファイルと分け、一文ずつ実行します。主キーの重複、列数と値の個数の不一致、必須名へのNULLをそれぞれ試します。

INSERT INTO products_13_lab (product_id, product_name, category, price)
VALUES (1, '중복 상품', '문구', 1000);

INSERT INTO products_13_lab (product_name, price) VALUES ('값 부족');

INSERT INTO products_13_lab (product_name, category, price)
VALUES (NULL, '문구', 1000);

各失敗後にCOUNT(*)が6か確認します。INSERT IGNOREやREPLACEで原因を隠さず、列と入力を修正します。警告は直後のSHOW WARNINGSで読みます。複数行INSERTは往復回数を減らせますが、文の大きさなどに限界があり、大量ファイルはCSV取り込みの検証も必要です。

やり直すときは、選択中のDB・実際の表定義・保存行を確認し、必要なものをバックアップします。削除してよいこの記事の実習表だけに次を実行します。DROP TABLEは定義と行を削除し、通常のROLLBACKでは戻せないため、トランザクションの実験とは分けます。

DROP TABLE shopcourse.products_13_lab;

関連する公式リファレンス