MySQL DUPLICATE KEY
在重复密钥更新上进行插入是MySQL中INSERT语句的扩展。当我们在SQL语句中指定ON DUPLICATE KEY UPDATE子句时,一行将在
UNIQUE或PRIMARY KEY 索引列中导致重复的错误值,然后更新现有行
换句话说,当我们在表中插入新值,并导致UNIQUE OR PRIMARY KEY列中的行重复时,我们将收到错误消息。但是,如果我们在 SQL 语句中使用ON DUPLICATE KEY UPDATE子句,它将用新行值更新旧行,无论它具有唯一键列还是主键列。
例如,如果列col1被定义为UNIQUE并在表tab1中包含值10,我们将得到类似的结果执行以下两条语句后的效果:
mysql> INSERT INTO tab1 (col1, col2, col3) VALUES (10,20,30) ON DUPLICATE KEY UPDATE col3=col3+1;
mysql> UPDATE tab1 SET col3=col3+1 WHERE col1=1;
请确保如果插入的行与表中的多个唯一索引匹配,则ON DUPLICATE KEY语句仅更新
第一个匹配的唯一索引。因此,不建议在包含多个唯一索引的表上使用此语句。
如果表包含AUTO_INCREMENT主键列,并且ON DUPLICATE KEY语句尝试插入或更新一行,则Last_Insert_ID()函数返回其AUTO_INCREMENT值。
以下是在重复密钥更新中插入"语句的语法../mysql-tutorial"> MySQL :
INSERT INTO table (column_names)
VALUES (data)
ON DUPLICATE KEY UPDATE
column1 = expression, column2 = expression…;
在这种语法中,我们可以看到 INSERT语句仅在ON DUPLICATE KEY UPDATE子句中添加
<每当发现重复的行时,strong>
列/值对赋值。 ON DUPLICATE KEY UPDATE子句的工作首先尝试将新值插入行中,如果发生错误,它将使用新行值更新现有行。
每当发现重复的行时,strong>
VALUES( )函数仅在本子句中使用,在任何其他上下文中均没有任何意义。它从INSERT部分返回列值,对多行插入特别有用。
MySQL根据给定的ON DUPLICATE KEY UPDATE语句给出
受影响行数动作:
如果将新行插入到表中,它将返回一个受影响的行。
如果将现有行更新到表中,它将返回两个受影响的行。
如果我们使用表中的当前值更新现有行,则它将返回受影响行数0。
MySQL INSERT ON DUPLICATE KEY示例
让我们借助示例了解MySQL中INSERT ON DUPLICATE KEY UPDATE子句的工作。
首先,使用以下语句创建一个名为
"学生" 的表:
CREATE TABLE Student (
Stud_ID int AUTO_INCREMENT PRIMARY KEY,
Name varchar(45) default NULL,
Email varchar(45) default NULL,
City varchar(25) default NULL
);
接下来,将数据插入表中。执行以下语句:
INSERT INTO Student(Stud_ID, Name, Email, City)
VALUES (1,'Stephen', 'stephen@lidihuo.com', 'Texax'),
(2, 'Joseph', 'Joseph@lidihuo.com', 'Alaska'),
(3, 'Peter', 'Peter@lidihuo.com', 'california');
执行
SELECT 语句以验证插入操作:
我们将在表中有
3 行的地方获得以下输出:
再次,使用以下查询在表中再添加一行:
INSERT INTO Student(Stud_ID, Name, Email, City)
VALUES (4,'John', 'john@lidihuo.com', 'New York');
上面的语句将成功添加行,因为它没有任何重复的值。
最后,我们将在
Stud_ID 列中添加具有重复值的行:
INSERT INTO Student(Stud_ID, Name, Email, City)
VALUES (4, 'John', 'john@lidihuo.com', 'New York')
ON DUPLICATE KEY UPDATE City = 'California';
在成功执行上述查询后,MySQL给出以下消息:
Query OK, 2 rows affected.
在下面的内容中,我们可以看到
行id = 4 已经存在。因此,查询仅使用
加利福尼亚州更新
纽约市。