如果条目不存在则创建,否则更新?

时间:2009-03-30 06:33:40

标签: php mysql

有点奇怪,把它写成简短的话,嘿。

无论如何,我想要的是基本上更新表中的条目(如果它存在),否则创建一个用相同数据填充它的新条目。

我知道这很容易,但就我使用它的程度而言,我对MySQL相对较新:P

4 个答案:

答案 0 :(得分:67)

许多开发人员仍然执行查询以检查表中是否存在字段,然后根据第一个查询的结果执行插入或更新查询。 尝试使用ON DUPLICATE KEY语法,这比执行2个查询更快更好。更多信息可以在here

找到
  

INSERT INTO表(a,b,c)VALUES(4,5,6)     ON DUPLICATE KEY UPDATE c = 9;

如果您想为c保留相同的值,则可以使用相同的值进行更新

  

INSERT INTO表(a,b,c)VALUES(4,5,6)     ON DUPLICATE KEY UPDATE c = 6;

'replace'和'on duplicate key'之间的区别:

  

替换:插入,删除和插入

     重复键上的

:插入或更新

如果您的表没有主键或唯一键,则替换没有任何意义。

您还可以使用VALUES功能来避免必须指定实际值两次。例如。而不是

INSERT INTO table (a,b,c) VALUES (4,5,6) ON DUPLICATE KEY UPDATE c=6;

你可以使用

INSERT INTO table (a,b,c) VALUES (4,5,6) ON DUPLICATE KEY UPDATE c=VALUES(c);

VALUES(c)将评估为当前指定的值(6)。

答案 1 :(得分:23)

使用'REPLACE INTO':

 REPLACE INTO table SET id = 42, foo = 'bar';

MySQL documentation

中查看更多内容

答案 2 :(得分:8)

正如其他人所说,REPLACE是要走的路。但是要小心使用它,因为它实际上在表上有DELETEINSERT。这在大多数情况下都很好,但是如果你的外键有ON DELETE CASCADE这样的约束,那么它可能会导致一些大问题。

答案 3 :(得分:2)

在MySQL手册中查找REPLACE

  

REPLACE与INSERT完全一样,   除非表中有一个旧行   与a的新行具有相同的值   PRIMARY KEY或UNIQUE索引,旧的   在新行之前删除行   插入。请参见第12.2.5节“INSERT   语法”。

     

REPLACE是MySQL的扩展   SQL标准。它要么插入,要么   删除和插入。对于另一个MySQL   扩展到标准SQL - 那   插入或更新 - 请参阅   Section 12.2.5.3,“INSERT ...... ON   DUPLICATE KEY UPDATE语法“。

如果您有以下INSERT查询:

INSERT INTO table (id, field1, field2) VALUES (1, 23, 24)

这是你应该运行的REPLACE查询:

REPLACE INTO table (id, field1, field2) VALUES (1, 23, 24)