「INSERT IF NOT EXISTS」と「REPLACE INTO」の違い
MySQLでINSERT IF NOT EXISTSを行う方法
MySQLでレコードを挿入する際、すでに同じレコードが存在するかどうかを確認してから挿入したい場合があります。このような場合、INSERT IF NOT EXISTS
という機能を使用できます。
方法
INSERT IF NOT EXISTS
を使用するには、以下のいずれかの方法を使用できます。
INSERT IGNORE
を使用すると、すでに同じレコードが存在する場合、エラーが発生せずに無視されます。
INSERT IGNORE INTO テーブル名 (カラム名, カラム名, ...)
VALUES (値, 値, ...);
INSERT ... ON DUPLICATE KEY UPDATE
を使用すると、すでに同じレコードが存在する場合、UPDATE
ステートメントが実行されます。
INSERT INTO テーブル名 (カラム名, カラム名, ...)
VALUES (値, 値, ...)
ON DUPLICATE KEY UPDATE
カラム名 = 値,
カラム名 = 値,
...;
例
以下の例は、users
テーブルにname
とage
というカラムを持つレコードを挿入する例です。
-- INSERT IGNOREを使用する例
INSERT IGNORE INTO users (name, age)
VALUES ('John Doe', 30);
-- INSERT ... ON DUPLICATE KEY UPDATEを使用する例
INSERT INTO users (name, age)
VALUES ('Jane Doe', 25)
ON DUPLICATE KEY UPDATE
age = age + 1;
注意事項
INSERT IGNORE
を使用すると、エラーが発生せずに無視されるため、レコードが挿入されたかどうかを確認する必要があります。
INSERT IGNORE
-- テーブル users の作成
CREATE TABLE users (
id INT PRIMARY KEY AUTO_INCREMENT,
name VARCHAR(255) NOT NULL,
age INT NOT NULL
);
-- 既存のレコード
INSERT INTO users (name, age) VALUES ('John Doe', 30);
-- 同じレコードを挿入
INSERT IGNORE INTO users (name, age) VALUES ('John Doe', 30);
-- 影響を受けた行数を確認
SELECT ROW_COUNT();
このコードを実行すると、ROW_COUNT()
は0
を返します。これは、同じレコードがすでに存在するため、挿入が実行されなかったことを示します。
INSERT ... ON DUPLICATE KEY UPDATE
-- テーブル users の作成
CREATE TABLE users (
id INT PRIMARY KEY AUTO_INCREMENT,
name VARCHAR(255) NOT NULL,
age INT NOT NULL
);
-- 既存のレコード
INSERT INTO users (name, age) VALUES ('Jane Doe', 25);
-- 同じレコードを挿入
INSERT INTO users (name, age) VALUES ('Jane Doe', 26)
ON DUPLICATE KEY UPDATE
age = age + 1;
-- 更新されたレコードを確認
SELECT * FROM users WHERE name = 'Jane Doe';
このコードを実行すると、age
カラムの値が26
に更新されたレコードが返されます。
MySQLでINSERT IF NOT EXISTSを行うその他の方法
REPLACE INTO
を使用すると、すでに同じレコードが存在する場合、既存のレコードが新しいレコードで置き換えられます。
REPLACE INTO テーブル名 (カラム名, カラム名, ...)
VALUES (値, 値, ...);
-- テーブル users の作成
CREATE TABLE users (
id INT PRIMARY KEY AUTO_INCREMENT,
name VARCHAR(255) NOT NULL,
age INT NOT NULL
);
-- 既存のレコード
INSERT INTO users (name, age) VALUES ('John Doe', 30);
-- 同じレコードを挿入
REPLACE INTO users (name, age) VALUES ('John Doe', 25);
-- 更新されたレコードを確認
SELECT * FROM users WHERE name = 'John Doe';
REPLACE INTO
を使用すると、既存のレコードが新しいレコードで置き換えられるため、注意が必要です。INSERT IGNORE
やINSERT ... ON DUPLICATE KEY UPDATE
と異なり、REPLACE INTO
はエラーを発生しません。
INSERT INTO ... SELECT ... FROM ... WHERE NOT EXISTS
を使用すると、サブクエリによって選択されたレコードがすでに存在しない場合のみ、レコードを挿入できます。
INSERT INTO テーブル名 (カラム名, カラム名, ...)
SELECT カラム名, カラム名, ...
FROM テーブル名
WHERE NOT EXISTS (
SELECT *
FROM テーブル名
WHERE 条件
);
-- テーブル users の作成
CREATE TABLE users (
id INT PRIMARY KEY AUTO_INCREMENT,
name VARCHAR(255) NOT NULL,
age INT NOT NULL
);
-- 既存のレコード
INSERT INTO users (name, age) VALUES ('John Doe', 30);
-- 同じレコードを挿入
INSERT INTO users (name, age)
SELECT 'John Doe', 25
FROM users
WHERE NOT EXISTS (
SELECT *
FROM users
WHERE name = 'John Doe'
);
-- 影響を受けた行数を確認
SELECT ROW_COUNT();
INSERT INTO ... SELECT ... FROM ... WHERE NOT EXISTS
は、複雑なクエリになる可能性があります。
mysql sql sql-insert