MySQL替换基于主键以外的东西

时间:2011-06-10 20:31:07

标签: php mysql

我有来自第三方的一行记录,包括第三方ID。有没有办法使用REPLACE命令,它将使用第三方ID而不是我们的内部ID来知道哪些记录在它们已经存在时会被覆盖?

来自第三方的示例数据列表:

array( 'name' => 'Bob',
       'age' => '30',
       'external_ID' => '540745'
);

out数据库的表结构:

ID int auto_increment primary key, 
name varchar(255), 
age int,
external_id int

2 个答案:

答案 0 :(得分:4)

external_id独一无二。它会起作用:

ALTER TABLE `test` ADD UNIQUE(`external_id`)

答案 1 :(得分:0)

我会非常重视使用REPLACE,原因很简单:IT MECHANICALLY PERFORMS DELETE AND INSERT UNDER THE HOOD !!!

Here is a bug report from 2005-09-26其中MySQL会在REPLACE上触发UPDATE触发器而不是DELETE和INSERT触发器。即使修复了这个错误,如果你有一个版本的MySQL在2005-09-26之前,立即升级或至少不要使用替换!!!!

最好不要使用INSERT IN DUPLICATE KEY UPDATE

Percona blogs about this 4 months after the bug report was closed and recommends the new feature of INSERT ON DUPLICATE KEY UPDATE.

如果您只是替换external_id,则可能不需要在exteral_id上使用UNIQUE INDEX。

查看使用REPLACE和具有auto_incrment ID的表时会发生什么:

REPLACE(内部DELETE和INSERT)将有效地更改与external_id关联的id字段。如果您跟踪年龄为30岁的Bob,其他表中使用ID为76且ID为76的外部ID 540745来引用Bob,则执行REPLACE可能会将Bob与其他表可能知道的原始ID断开连接。