gpt4 book ai didi

mysql - 从旧表填充新表时重复主键

转载 作者:行者123 更新时间:2023-11-29 22:24:22 26 4
gpt4 key购买 nike

我创建了多个索引表,我想将它们绑定(bind)到旧表的新规范化版本中。我对所有内容进行了索引并设置了关系,并且收到了“关键‘Primary’的重复条目‘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);

最佳答案

我假设您是在问一个问题,而不仅仅是提供状态报告

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

或者 1) dvdId 列在从中检索的表中不是唯一的,或者 2) 在其他三个表之一中存在多个“匹配”行。

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

但是,如果 dvd 中的该行有来自其他三个表中的一个(或多个)的多个“匹配”行,那么我们期望 SELECT为 dvdId 生成“重复”值。

例如,如果 genre 列在 dvdGenre 表中不唯一,或者 studioName 列在 dvdStudio< 中不唯一,我们希望查询返回 dvd 中该行的多个副本。当我们“非规范化”数据时,会出现冗余数据(重复值)。

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

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

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

由于列引用未限定,我们实际上无法判断 dvdId 列是从哪个表返回的。我们无法判断任何列是从哪个表返回的。我们可以“猜测”genreId 是从 dvdGenre 表返回的,但为了弄清楚这一点,我们需要研究架构定义。这对 MySQL 来说不是问题,它查找表定义的速度比我们快得多。

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

关于mysql - 从旧表填充新表时重复主键,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30408311/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com