通过脚本创建数据库时遭遇PK_Casting主键约束冲突求助
解决PRIMARY KEY约束错误及数据库关系逻辑问题
先直接说问题根源:你遇到的Msg 2627错误,主要是CASTING表的主键设计错误,再加上表之间的外键关系完全颠倒,我们一步步来修正:
1. 错误原因拆解
- CASTING表主键不合理:你把
Film_id设为CASTING的主键,但一部电影必然对应多个演员(比如你插入的Film_id=1同时对应Tom Hanks和Helen Hunt),这就导致插入重复Film_id时触发主键唯一性约束,直接报错。 - 外键关系逻辑搞反:现在FILM表的外键引用CASTING的Film_id,这完全不符合业务逻辑——应该是先有电影,再记录这部电影的参演演员,所以正确的关联应该是CASTING表去引用FILM表的主键。
2. 修正后的完整可执行脚本
USE master GO IF EXISTS (SELECT * FROM sysdatabases WHERE NAME = 'MijnFilms') BEGIN ALTER DATABASE MijnFilms SET SINGLE_USER WITH ROLLBACK IMMEDIATE DROP DATABASE MijnFilms END GO -- 创建MijnFilms数据库 CREATE DATABASE MijnFilms GO USE MijnFilms GO -- 创建ACTEUR表(演员主表) CREATE TABLE ACTEUR ( Acteur_id int NOT NULL, ActeurNaam nvarchar(40), CONSTRAINT PK_Acteur PRIMARY KEY(acteur_id) ) GO -- 先创建FILM表(电影主表,添加主键约束) CREATE TABLE FILM ( Film_id int NOT NULL, Titel nvarchar(40), Jaar smallint, Score int, Stemmen int, CONSTRAINT PK_Film PRIMARY KEY(Film_id) ) GO -- 创建CASTING表(多对多关联表,使用复合主键) CREATE TABLE CASTING ( Film_id int NOT NULL, Acteur_id int NOT NULL, -- 用电影ID+演员ID的组合作为主键,确保每个组合唯一 CONSTRAINT PK_Casting PRIMARY KEY(Film_id, Acteur_id), -- 关联电影主表 CONSTRAINT FK_Casting_Film FOREIGN KEY(Film_id) REFERENCES FILM(Film_id), -- 关联演员主表 CONSTRAINT FK_Casting_Acteur FOREIGN KEY(Acteur_id) REFERENCES ACTEUR(acteur_id) ) GO -- 插入测试数据 INSERT INTO ACTEUR(Acteur_id, ActeurNaam) VALUES (1, 'Tom Hanks') INSERT INTO ACTEUR(Acteur_id, ActeurNaam) VALUES (2, 'Helen Hunt') INSERT INTO ACTEUR(Acteur_id, ActeurNaam) VALUES (3, 'Catherine Zeta Jones') GO -- 先插入电影数据,再插入演员表数据 INSERT INTO FILM(Film_id, Titel, Jaar, Score, Stemmen) VALUES (1, 'Cast Away', 2000, 75,1) INSERT INTO FILM(Film_id, Titel, Jaar, Score, Stemmen) VALUES (2, 'The Terminal', 2004, 62,1) GO INSERT INTO CASTING (Film_id, Acteur_id) VALUES (1, 1) INSERT INTO CASTING (Film_id, Acteur_id) VALUES (1, 2) INSERT INTO CASTING (Film_id, Acteur_id) VALUES (2, 1) INSERT INTO CASTING (Film_id, Acteur_id) VALUES (2, 3) GO
3. 核心修正说明
- 复合主键替代单一主键:CASTING表使用
(Film_id, Acteur_id)作为复合主键,这样同一部电影可以对应多个演员,只要每个“电影+演员”的组合唯一就不会触发主键重复错误。 - 调整表创建顺序:先创建FILM和ACTEUR这两个基础主表,再创建依赖它们的CASTING关联表,符合数据库外键的依赖逻辑。
- 修正外键关联方向:让CASTING表的
Film_id关联到FILM表的主键,完全贴合“先有电影,后有演员表”的实际业务流程,同时移除了FILM表中错误的外键约束。
执行上面的脚本就能顺利创建数据库和插入测试数据了。
内容的提问来源于stack exchange,提问作者Lannoo Kjell
相关产品推荐
相关产品推荐

