MYSQL替换为永不替换?

时间:2012-08-27 01:20:37

标签: mysql sql

我还没有真正理解REPLACE INTO的工作方式。 根据我的理解,如果任何值与旧行值匹配,它将删除行并插入更新的数据?

例如我有这张表

+-------------+----------------+------+---------+
| name        | value          | city | address |
+-------------+----------------+------+---------+
| First book  | a value        | NY   | NULL    |
| second book | an other value | LA   | NULL    |
+-------------+----------------+------+---------+

现在我想改变第二本书的城市并执行

REPLACE INTO book(name,value,city) VALUES ('second book','an other value','CA');

注意:名称和值是相同的,但mysql仍会插入一个新行?

+-------------+----------------+------+---------+
| name        | value          | city | address |
+-------------+----------------+------+---------+
| First book  | a value        | NY   | NULL    |
| second book | an other value | LA   | NULL    |
| second book | an other value | CA   | NULL    |
+-------------+----------------+------+---------+

3 个答案:

答案 0 :(得分:3)

您可以阅读this link

  

上面两个SQL命令的结果可以使用单个查询来实现 - 使用REPLACE INTO。 REPLACE语句的工作方式与INSERT查询的工作方式相同。唯一的区别是他们处理重复记录的方式。如果表上存在唯一索引,并且您尝试插入具有先前插入的键值的记录,则将首先删除该记录并插入新记录。

这意味着只有在表中存在唯一键时才会更新,并且您尝试插入此键上存在的值。在那种情况下,更新,否则,插入

答案 1 :(得分:1)

MySQL需要知道如何识别REPLACE行。这样做的方法是使用一个唯一的密钥,只需插入数据就会违反。

在您的示例中,一种解决方案是在UNIQUE KEY上放置name。然后您的REPLACE将正常运行。

答案 2 :(得分:0)

尝试使用INSERT ON DUPLICATE KEY UPDATE,但请确保您有name应该是unique key的约束。

INSERT INTO book (`name`, `value`, `city`)
VALUES ('second book', 'an other value', 'CA')
ON DUPLICATE KEY 
UPDATE `value` = 'an other value',
        `city` = 'CA'

See Example Link
INSERT ON DUPLICATE KEY UPDATE vs REPLACE INTO performance