MySQL更新表并从子查询中的同一个表中进行选择

时间:2013-12-26 14:25:31

标签: mysql sql

我有链接表

CREATE TABLE `linktable` (
`id ` BIGINT(20) UNSIGNED NOT NULL AUTO_INCREMENT,
`idParent` BIGINT(20) UNSIGNED NOT NULL,
`Role` ENUM('Contacts','Expert','...') NULL DEFAULT NULL,
`idChild` BIGINT(20) UNSIGNED NOT NULL,
PRIMARY KEY (`idt`),
UNIQUE INDEX `UK_Parent_Child_Role` (`idParent`, `idChild`, `Role`)
)

我想更新此表,不要破坏唯一键。 使用其他数据库,我可以这样做:

Update linktable lt1 Set lt1.Parent = :ziNew Where lt1.idParent = :ziOld
and not exists (select * from linktable lt2 where lt2.idParent = :ziNew and lt1.role = lt2.role and lt1.idChild = lt2.idChild);

如何使用MySQL进行此操作?

1 个答案:

答案 0 :(得分:1)

对变量使用相同的语法,您可以使用连接:

Update linktable lt1 left outer join
       (select *
        from linktable lt2
         where lt2.idParent = :ziNew
       ) lt2
       on lt1.role = lt2.role and lt1.idChild = lt2.idChild
    Set lt1.Parent = :ziNew
    Where lt1.Parent =:ziOld and lt2.idParent is null;

MySQL中的问题是子查询与update d表是同一个表。如果它是一个不同的表,那么带有not exists的原始表单仍然有效。