Php 插入或更新行(如果存在)

Php 插入或更新行(如果存在),php,mysql,Php,Mysql,我使用类似于此的mysql约定输入表单信息 form_id - INT PRI user_id - INT field_name - VARCHAR field_value - TEXT 我目前有一个PHP脚本,它通过所有表单字段的foreach循环,首先检查它是否存在,如果计数大于0,则更新字段。如果不存在,则插入该行。不幸的是,我正试图通过PHP脚本处理100多个字段,这种方法非常耗时。做这件事的更快的方法是什么?我认为我不能用于重复密钥更新,因为只有表单id是唯一的 每一行是这样的: 1

我使用类似于此的mysql约定输入表单信息

form_id - INT PRI
user_id - INT
field_name - VARCHAR
field_value - TEXT
我目前有一个PHP脚本,它通过所有表单字段的foreach循环,首先检查它是否存在,如果计数大于0,则更新字段。如果不存在,则插入该行。不幸的是,我正试图通过PHP脚本处理100多个字段,这种方法非常耗时。做这件事的更快的方法是什么?我认为我不能用于重复密钥更新,因为只有表单id是唯一的

每一行是这样的:

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

这有意义吗?

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

例如,不是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 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)

我希望我能让大家理解。但是这可以节省你很多时间

问题是什么;如果要在foreach循环中插入数据,则应在foreach循环中创建一个数组,然后使用数组插入一次数据。您是使用php构建MySQL语句,还是为循环的每个迭代打开连接?我使用php和MySQLi首先根据字段名称检查行是否存在,如果有,就更新它。如果它不存在,那么我只是创建它。因此,它实际上要遍历脚本中非常耗时的每一行。如果字段名称决定是否插入或更新该行,那么字段名称应该是唯一的。为了实现这一点,您需要一个唯一的索引。我尝试了一个重复的密钥更新,但每次都会插入。如果您比较这些字段,它们应该是主键,因为这是这个字段正在检查的,因为没有自定义逻辑。它不是在输入值时比较这些值。它是比较您为主键输入的值。除了主键,您还可以有一个唯一的索引afaik。