插入新行,更新旧行:如何?
问题描述:
我正在制作一个PHP实用程序,用于将CSV文件导入并分析为$data
以及是否向数据库中插入“新”行($saveNew
)。插入新行,更新旧行:如何?
现在,我有一个有点丑陋的烂摊子:(广义伪PHP)
function synchronize($data,$saveNew) {
$existing_ids = $table->find_all('ID'); //array of ID's in the table
$incoming_ids = get_key('ID',$data); //grabs the ID field from each record
$new_ids = array_diff($incoming_ids,$existing_ids);
foreach ($data as $record) {
if (in_array($record['ID'],$new_ids)) { //it's new
if ($saveNew) $table->insert($record);
else continue;
} else {
$table->update($record);
}
}
}
对我来说,这只是有一个气味,我想我可以在短短一个做到这一点查询,除了我不熟悉SQL。
我在我的应用程序中使用了一个简单的ORM,但我可以轻松地使用直接的SQL。
哦,我正在使用MySQL。
这可以只用一个查询来完成吗?这似乎是一个简单的解决方案的常见问题,但我无法弄清楚。
答
看一看MySQL的INSERT ... ON DUPLICATE KEY ...
语法,它可以让你做到这一点:http://dev.mysql.com/doc/refman/5.1/en/insert-on-duplicate.html
无论你是想实现在你的ORM或在你的特定子程序是你的...
答
如果你有一个唯一行标识符,您可以使用INSERT ... ON DUPLICATE KEY UPDATE
语法:
INSERT INTO foo (id, col1, col2) VALUES (?, ?, ?)
ON DUPLICATE KEY UPDATE col1 = VALUES(col1), col2 = VALUES(col2);
然后,当你绑定NULL, 4, 5
它会插入新行(假设id
是一个utoincrement列)
当您绑定1, 4, 5
它会插入新行,如果没有第1行,否则它会更新1行的col1
和col2
领域4
和5
分别...
这看起来多少更好,但是这不仅仅适用于'$ saveNew'为真的情况吗?如果我们想'同步($ data,false)',那么我们根本不想'插入'。有没有更新IF EXISTS这样的东西? – 2010-07-30 15:08:18
当你调用'UPDATE ... WHERE id = 5'时,不需要'UPDATE IF EXISTS' ...如果id不存在'5',它就不会更新任何东西......没有错误,只是没有更新... – ircmaxell 2010-07-30 15:16:48
@ircmaxwell:哦,哇,谈论一个“呃!”我的时刻。我显然不是很直白......:D – 2010-07-30 15:21:06