插入或更新如果存在行

时间:2014-03-03 21:52:04

标签: php mysql

我正在使用与此类似的mysql约定来输入表单信息

form_id - INT PRI
user_id - INT
field_name - VARCHAR
field_value - TEXT

我目前有一个PHP脚本,它遍历所有表单字段的foreach循环,并首先检查它是否存在,如果计数大于0,则它会更新字段。如果它不存在,则插入该行。不幸的是,我试图通过PHP脚本处理超过一百个字段,并且这种方法被证明是非常耗时的。有什么更快的方法呢?我不认为我可以使用on duplicate key update,因为只有form_id是唯一的。

每一行如何:

1, 1, name, Andy
2, 1, date, 2012-10-05
3, 2, name, John

这样有意义吗?

1 个答案:

答案 0 :(得分:0)

我看到这是MySQL。在您的描述之后,您正在使用PHP进行双重工作。只需收集所有值并使用正确的SQL将它们激发到数据库中。为此,您可以使用MERGE STATEMENTS,它几乎在所有数据库系统上都可用,只是使用不同的语法。合并语句正在插入一行,如果一行已经存在,则只更新具有新值的行。或者你可以说它应该忽略行等许多可能性。

例如(NOT MYSQL!):

 MERGE INTO tablename USING table_reference ON (condition)
   WHEN MATCHED THEN
   UPDATE SET column1 = value1 [, column2 = value2 ...]
   WHEN NOT MATCHED THEN
   INSERT (column1 [, column2 ...]) VALUES (value1 [, value2 ...

在MySQL中它有点不同。在那里你使用INSERT... ON DUPLICATE UPDATE

http://dev.mysql.com/doc/refman/5.1/en/insert-on-duplicate.html

为此,这是一个例子(没有使用你的字段):

INSERT INTO table (table.a, table.b, table.c, table.d)  -- define your insert statement
VALUES  -- use the VALUES command to add several rows, or just one. Depends on your interface
('key1','key2','exampleVal','exampleValb'), 
('key1','key3','exampleVal2131','exampleValasfasf')
ON DUPLICATE KEY UPDATE  -- Here the check appears. If the Values with key (a) + key (b) exist it will just UPDATE the fields c and d with VALUES(table.c) and VALUES(table.d)
table.c = VALUES(table.c),
table.d = VALUES(table.d)

我希望我无论如何都能理解这一点。但这可以为你节省很多时间!