MariaDBにおけるINSERT - デフォルト値と重複値の処理


デフォルト値の処理

INSERTステートメントに値を明示的に指定しない場合、列に定義されたデフォルト値が使用されます。デフォルト値が定義されていない列には、NULL値が挿入されます。

例:

INSERT INTO customers (first_name, last_name, email)
VALUES ('John', 'Doe', '[email protected]');

この例では、first_namelast_name には値が明示的に指定されていますが、email には値が指定されていません。email 列にはデフォルト値が定義されている場合、そのデフォルト値が使用されます。デフォルト値が定義されていない場合は、NULL が挿入されます。

重複値の処理

デフォルトでは、MariaDBは同じ列値を持つレコードを複数回挿入することを許可しません。つまり、PRIMARY KEY または UNIQUE 制約で定義された列に重複する値を持つレコードを挿入しようとすると、エラーが発生します。

INSERT INTO customers (first_name, last_name, email)
VALUES ('John', 'Doe', '[email protected]');

INSERT INTO customers (first_name, last_name, email)
VALUES ('John', 'Doe', '[email protected]');

この例では、2番目の INSERT ステートメントはエラーになります。email 列には UNIQUE 制約が定義されているため、同じ値を持つレコードを挿入することはできません。

IGNORE または REPLACE キーワードを使用することで、重複値の挿入を許可することができます。

1 IGNORE キーワード

IGNORE キーワードを使用すると、重複するレコードがスキップされ、エラーは発生しません。

INSERT IGNORE INTO customers (first_name, last_name, email)
VALUES ('John', 'Doe', '[email protected]');

INSERT IGNORE INTO customers (first_name, last_name, email)
VALUES ('John', 'Doe', '[email protected]');

この例では、2番目の INSERT ステートメントはエラーにならず、スキップされます。

2 REPLACE キーワード

REPLACE キーワードを使用すると、既存のレコードが新しいレコードで置き換えられます。

INSERT INTO customers (first_name, last_name, email)
VALUES ('John', 'Doe', '[email protected]');

INSERT REPLACE INTO customers (first_name, last_name, email)
VALUES ('John', 'Doe', '[email protected]');

この例では、2番目の INSERT ステートメントは既存のレコードを置き換え、email 列の値が [email protected] に更新されます。

  • REPLACE キーワードを使用すると、既存のレコードが新しいレコードで置き換えられます。
  • IGNORE キーワードを使用すると、重複するレコードがスキップされます。
  • デフォルトでは、重複するレコードの挿入は許可されません。
  • デフォルト値は、INSERTステートメントで値を明示的に指定していない列に挿入されます。


デフォルト値

以下の例では、customers テーブルに新しいレコードを挿入します。email 列には値が明示的に指定されていませんが、email 列にはデフォルト値が定義されているため、そのデフォルト値が使用されます。

INSERT INTO customers (first_name, last_name)
VALUES ('John', 'Doe');

重複値のエラー

以下の例では、email 列に同じ値を持つ2つのレコードを挿入しようとします。email 列には UNIQUE 制約が定義されているため、エラーが発生します。

INSERT INTO customers (first_name, last_name, email)
VALUES ('John', 'Doe', '[email protected]');

INSERT INTO customers (first_name, last_name, email)
VALUES ('Jane', 'Doe', '[email protected]');

以下の例では、email 列に同じ値を持つ2つのレコードを挿入しようとします。IGNORE キーワードを使用しているため、2番目の INSERT ステートメントはエラーにならず、スキップされます。

INSERT INTO customers (first_name, last_name, email)
VALUES ('John', 'Doe', '[email protected]');

INSERT IGNORE INTO customers (first_name, last_name, email)
VALUES ('Jane', 'Doe', '[email protected]');

以下の例では、email 列に同じ値を持つ2つのレコードを挿入します。REPLACE キーワードを使用しているため、2番目の INSERT ステートメントは既存のレコードを置き換え、email 列の値が [email protected] に更新されます。

INSERT INTO customers (first_name, last_name, email)
VALUES ('John', 'Doe', '[email protected]');

INSERT REPLACE INTO customers (first_name, last_name, email)
VALUES ('Jane', 'Doe', '[email protected]');
  • 実際のコードは、使用するデータベースのスキーマと要件に応じて調整する必要があります。
  • 上記のコードは、MariaDB 10.5以降で使用できます。


REPLACE INTO

REPLACE INTO ステートメントは、既存のレコードを新しいレコードで置き換えるために使用されます。既存のレコードと一致する主キーを持つレコードが既に存在する場合、そのレコードは新しいレコードで置き換えられます。

REPLACE INTO customers (first_name, last_name, email)
VALUES ('John', 'Doe', '[email protected]');

SELECT * FROM customers;

この例では、customers テーブルに John Doe という名前の顧客が既に存在する場合、そのレコードは新しいレコードで置き換えられ、email 列の値が [email protected] に更新されます。

利点

  • 既存のレコードを簡単に更新できる。

欠点

  • データの整合性を保つために注意が必要。
  • 重複するレコードを識別して処理する必要がある。

ON DUPLICATE KEY UPDATE

ON DUPLICATE KEY UPDATE 句は、INSERT INTO または REPLACE INTO ステートメントと組み合わせて使用し、重複するレコードを検出した場合に実行するアクションを指定するために使用されます。

INSERT INTO customers (first_name, last_name, email)
VALUES ('John', 'Doe', '[email protected]')
ON DUPLICATE KEY UPDATE email = '[email protected]';

SELECT * FROM customers;

この例では、customers テーブルに John Doe という名前の顧客が既に存在する場合、そのレコードの email 列の値が [email protected] に更新されます。

利点

  • データの整合性を保ちやすい。
  • 重複するレコードを自動的に更新できる。

欠点

  • ON DUPLICATE KEY UPDATE 句は、INSERT INTO または REPLACE INTO ステートメントと組み合わせて使用する必要がある。

UPSERT

UPSERT は、INSERTUPDATE の機能を組み合わせたものです。既存のレコードと一致するレコードが既に存在する場合は、そのレコードを更新し、存在しない場合は新しいレコードを挿入します。

MariaDB にはネイティブの UPSERT ステートメントはありませんが、いくつかの方法でシミュレートできます。

方法 1: REPLACE INTO と ON DUPLICATE KEY UPDATE の組み合わせ

前述の例で示したように、REPLACE INTO ステートメントと ON DUPLICATE KEY UPDATE 句を組み合わせて使用することで、UPSERT のような動作をシミュレートできます。

方法 2: MERGE ステートメント

MERGE ステートメントを使用して、既存のレコードと一致するレコードを更新し、存在しない場合は新しいレコードを挿入することもできます。

MERGE INTO customers
USING (
  SELECT 'John' AS first_name, 'Doe' AS last_name, '[email protected]' AS email
) AS new_data
ON (customers.first_name = new_data.first_name
  AND customers.last_name = new_data.last_name)
WHEN MATCHED THEN
  UPDATE SET email = new_data.email
WHEN NOT MATCHED THEN
  INSERT (first_name, last_name, email)
  VALUES (new_data.first_name, new_data.last_name, new_data.email);

SELECT * FROM customers;

この例では、customers テーブルに John Doe という名前の顧客が既に存在する場合、そのレコードの email 列の値が [email protected] に更新されます。存在しない場合は、新しいレコードが挿入されます。

利点

  • データの整合性を保ちやすい。
  • 既存のレコードを更新し、存在しない場合は新しいレコードを挿入できる。

欠点

  • MERGE ステートメントは、MariaDB 5.7以降でのみ使用できます。
  • REPLACE INTOON DUPLICATE KEY UPDATE の組み合わせよりも複雑。

LOAD DATA INFILE

LOAD DATA INFILE ステートメントは、テキストファイルからデータを迅速かつ効率的にロードするために使用されます。重複するレコードを処理するためのオプションがいくつか用意されています。

  • IGNORE キーワード: 重複する