Learning site for website creation

MySQLで複数レコードを一括挿入時の「NOT NULL」フィールドの挙動

  • 投稿日:2020年09月25日

複数レコード挿入時はNULLの代わりにフィールドが持つ型の初期値が挿入されています。

数値系フィールドには「0」、文字列系フィールドには「(空文字)」が挿入されます。

テスト用テーブル作成

itemフィールドとpriceフィールドに「NOT NULL」を指定してテーブルを作成します。

CREATE TABLE test1 (
id INT AUTO_INCREMENT PRIMARY KEY,
item CHAR(10) NOT NULL,
price INT NOT NULL
);

1つのレコードを挿入

1つレコードを挿入した時に「NOT NULL」フィールドに「NULL」を指定して挿入するとエラーになります。

実行例1

priceフィールドにNULLを指定して挿入したのでエラー。

MariaDB [lesson]> INSERT INTO test1 (item, price) VALUES ('商品1', NULL);
ERROR 1048 (23000): Column 'price' cannot be null

複数のレコードを一括挿入

複数レコードを挿入した時に「NOT NULL」フィールドに「NULL」を指定して挿入してもエラーにならず、フィールドの型にあわせた初期値が挿入されます。

数値系フィールドには「0」、文字列系フィールドには「(空文字)」が挿入されます。

実行例2

複数レコード一括挿入の場合はNULLを指定してもエラーにならず「warning」を表示して挿入されます。

MariaDB [lesson]> INSERT INTO test1 (item, price) VALUES
    -> ('商品1', NULL),
    -> (NULL, 200);
Query OK, 2 rows affected, 2 warnings (0.035 sec)
Records: 2  Duplicates: 0  Warnings: 2

Warningを表示

「SHOW WARNINGS;」を使って詳細を表示します。

NOT NULL指定フィールドなのでNULLを挿入できなかった旨が表示されます。

MariaDB [lesson]> SHOW WARNINGS;
+---------+------+-------------------------------+
| Level   | Code | Message                       |
+---------+------+-------------------------------+
| Warning | 1048 | Column 'price' cannot be null |
| Warning | 1048 | Column 'item' cannot be null  |
+---------+------+-------------------------------+
2 rows in set (0.000 sec)

挿入されたレコードの確認

テーブル情報を表示します。

NULLの代わりにフィールドが持つ型の初期値が挿入されています。

数値系フィールドには「0」、文字列系フィールドには「(空文字)」が挿入されます。

MariaDB [lesson]> SELECT * FROM test1;
+----+--------+-------+
| id | item   | price |
+----+--------+-------+
|  1 | 商品1 |     0 |
|  2 |        |   200 |
+----+--------+-------+
2 rows in set (0.000 sec)

今回使用したコード

# テストテーブル作成
CREATE TABLE test1 (
id INT AUTO_INCREMENT PRIMARY KEY,
item CHAR(10) NOT NULL,
price INT NOT NULL
);

# 1つのレコードを挿入
INSERT INTO test1 (item, price) VALUES ('商品1', NULL);

# 複数のレコードを挿入
INSERT INTO test1 (item, price) VALUES
('商品1', NULL),
(NULL, 200);

# Warningsを詳細表示
SHOW WARNINGS;

# テストテーブルを表示
SELECT * FROM test1;