从旧表填充新表时复制主键

时间:2015-05-23 02:33:40

标签: mysql

我创建了多个索引表,我希望将它们绑定到旧表的新规范化版本中。我得到所有索引和关系设置,我得到一个“重复条目'11'关键'主要'”错误消息。

这是我用来填充新表的代码。

insert into dvdNormal(dvdId, dvdTitle, year, publicRating, dvdStudioId, 
dvdStatusId, dvdGenreId)
(
select dvdId, dvdTitle, year, publicRating, studioId, statusId, genreId
from dvd d
join dvdStudio on d.studio = dvdStudio.studioName
join dvdStatus on d.status = dvdStatus.dvdStatus
join dvdGenre on d.genre = dvdGenre.genre);

1 个答案:

答案 0 :(得分:0)

我会假设你问的是问题,而不只是提供状态报告

您观察到的行为(很可能)是由于insert语句试图插入违反目标表中dvdId列上定义的UNIQUE(或PRIMARY KEY)约束的行(表中的语句)正在插入行。)

并且1)dvdId列在从中检索的表中不是唯一的,或者2)有多个匹配的"排在其他三个表中的一个。

例如,如果dvdIddvd中的列,并且它被定义为UNIQUE,则情况1)不适用。

但是,如果来自dvd的那一行多个"匹配"从其他三个表中的一个(或多个)行开始,然后我们期望SELECT生成"重复" dvdId的值。

例如,如果genre列中dvdGenre列不唯一,或studioName列中的dvdStudio列不唯一,我们就会期望查询从dvd返回该行的多个副本。当我们"非规范化"时,预期冗余数据(重复值)。数据

如果我们想从查询中加载表格,那么有几个选项。

如果我们想要存储查询返回的每一行,我们将从dvdId列中删除UNIQUE约束。 (可能还有其他UNIQUE约束需要从目标表中删除。)

如果我们只想存储来自dvd的行的一个副本,以及来自其他每个表的一个匹配行的值,我们可以保留UNIQUE约束,并使用{ {1}}语句,以避免抛出"重复键错误"。将丢弃该错误的任何行将被丢弃,并且不会被插入目标表中。

由于列引用不合格,我们实际上无法确定从哪个表中返回INSERT IGNORE列。我们无法告诉从哪个表返回任何列。我们可以猜测"从dvdId表格返回genreId,但为了让我们明白这一点,我们需要调查架构定义。这对MySQL来说不是问题,它可以比我们更快地查找表定义。

我们可以通过使用tablename或表别名限定列引用来帮助该SQL语句的未来读者。

相关问题