我正在创建一个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。
这可以通过一个查询完成吗?看起来这是一个简单解决方案的常见问题,但我无法弄明白。
答案 0 :(得分:3)
查看MySQL的INSERT ... ON DUPLICATE KEY ...
语法,它允许您这样做:http://dev.mysql.com/doc/refman/5.1/en/insert-on-duplicate.html
您是想在ORM中实现该功能还是在您的特定子程序中实现该功能取决于您...
答案 1 :(得分:0)
如果您有唯一的行标识符,则可以使用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
是一个自动增量列)
绑定1, 4, 5
时,如果没有第1行,则会插入新行,否则会将第1行的col1
和col2
字段更新为4
和5
分别......