2014-03-03 82 views
0

我使用一个类似的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 

难道那种有意义吗?

+0

这是个问题吗? ;) – 2014-03-03 21:54:01

+1

如果你在foreach循环中插入数据,你应该在foreach循环中创建一个数组,然后使用数组插入一次数据 – Dan

+0

你使用PHP来构建MySQL语句,还是打开一个连接每个循环的迭代? – dsimer

回答

0

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

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

我希望我做了这个无论如何理解的。但是这可以节省你很多时间!

+0

我试过重复密钥更新,但每次都会插入。 – ashin999

+0

这些字段应该是主键,如果你比较它们,因为这是这个检查的内容,因为没有定制的逻辑。在输入它们时不会比较这些值。它正在比较您为主键添加的值。而不是主键,你也可以有一个独特的索引afaik。 – creativeby

相关问题