我有一个varchar(255)的记录,它作为我表的主键。我需要能够将记录的主键更新为新值,但是如果新主键已经存在于表中,那么这实际上是一个重复记录,然后我想要删除它。
我对如何实际执行此操作感到困惑,并且非常感谢任何有关示例的帮助。
是否可以在单个查询中执行此操作作为最理想的解决方案?
答案 0 :(得分:1)
好的,所以这样做原子而不使用除键之外的任何东西而不改变你的数据库结构将不得不看起来像这样:
begin;
delete from t where keycol = $keycol;
update t set keycol = $keycol where keycol = $oldkeycol;
commit;
如果没有交易,您无法保证不会丢失数据。但是,只有先删除原始数据,才能成功更新。
答案 1 :(得分:0)
您可能需要replace
声明。如果表中存在新密钥,则可以替换密钥中的值。
类似的东西:
replace t(keycol, col1, col2, col3)
values ($keycol, $col1, $col2, $col3);
如果表中已存在$keycol
,则删除现有记录并插入新值。如果它不存在,则插入新值。
如果你特意想做你说的话,那就像:
delete from t where keycol = $keycol;
if mysql_affected_rows() = 0
update t
set keycol = $keycol where keycol = $oldkeycol;