Mysql 简明教程
MySQL − Insert on Duplicate Key Update
INSERT INTO 语句在 MySQL 中用于向特定表中插入新记录。
MySQL Insert on Duplicate Key Update Statement
当我们尝试使用 UNIQUE INDEX 或 PRIMARY KEY 向 MySQL 表列中插入新行时,如果要插入的值在该列中已经存在,MySQL 会发出错误。这是因为这些约束需要唯一值,不允许重复值。
但是,如果我们将 MySQL ON DUPLICATE KEY UPDATE 子句与 INSERT INTO 语句一起使用,MySQL 会使用新值更新现有行,而不是显示错误。
Syntax
以下是 MySQL 中 ON DUPLICATE KEY UPDATE 子句的基本语法:
INSERT INTO my_table (col1, col2, ...)
VALUES (val1, val2), (val3, val4), ...
ON DUPLICATE KEY UPDATE <col1>=<val1>, <col2>=<val2>,...;
Example
首先,让我们使用以下查询创建一个名为 CUSTOMERS 的表:
CREATE TABLE CUSTOMERS (
ID int NOT NULL,
NAME varchar(20) NOT NULL,
AGE int NOT NULL,
ADDRESS char (25),
SALARY decimal (18, 2),
PRIMARY KEY (ID)
);
这里,我们将使用 INSERT INTO 语句向上述创建的表中插入部分记录,如下所示:
INSERT INTO CUSTOMERS (ID,NAME,AGE,ADDRESS,SALARY) VALUES
(1, 'Ramesh', 32, 'Ahmedabad', 2000.00 ),
(2, 'Khilan', 25, 'Delhi', 1500.00 ),
(3, 'Kaushik', 23, 'Kota', 2000.00 );
执行以下查询以显示上述创建的 CUSTOMERS 表中存在的记录:
SELECT * FROM CUSTOMERS;
以下是 CUSTOMERS 表中的记录:
在这里,我们使用 INSERT INTO 语句向 CUSTOMERS 表中插入另一行,其中 ID 值为 3 :
INSERT INTO CUSTOMERS (ID, NAME, AGE, ADDRESS, SALARY)
VALUES (3, 'Chaitali', 25, 'Mumbai', 6500.00);
因此,MySQL 会发出错误,因为我们正在插入一个重复的 ID 值:
ERROR 1062 (23000): Duplicate entry '3' for key 'customers.PRIMARY'
我们可以避免上述错误,并使用 ON DUPLICATE KEY UPDATE 子句和 INSERT INTO 语句来更新现有行,如下所示:
INSERT INTO CUSTOMERS (ID, NAME, AGE, ADDRESS, SALARY)
VALUES (3, 'Chaitali', 25, 'Mumbai', 6500.00)
ON DUPLICATE KEY UPDATE NAME = "Chaitali",
AGE = 25,
ADDRESS = "Mumbai",
SALARY = 6500.00;
INSERT or UPDATE multiple records at once
在 MySQL 中同时插入或更新多条记录时,要为每列设置的值可能因存在冲突的记录而异。
例如,如果我们尝试插入四行新行,但第三行具有与现有记录相冲突的 ID 列,则很可能希望根据第三行中预期的信息更新现有行。
Example
在执行下一个操作之前,我们先查看更新的 CUSTOMERS 表中的记录:
SELECT * FROM CUSTOMERS;
以下是更新后的 CUSTOMERS 表:
以下查询向 CUSTOMERS 表中添加两行新行:
INSERT INTO CUSTOMERS (ID, NAME, AGE, ADDRESS, SALARY)
VALUES (5, "Komal", 22, "Hyderabad", 4500.00),
(4, "Kaushik", 23, "Kota", 2000.00)
ON DUPLICATE KEY UPDATE
NAME = VALUES(NAME),
AGE = VALUES(AGE),
ADDRESS = VALUES(ADDRESS),
SALARY = VALUES(SALARY);