SQL; PRIMARY KEY约束的变形

问题描述 投票:0回答:3

我正在尝试通过脚本添加新的数据库,但遇到一些错误,已经准备好放出双重假象,但这对我不起作用。

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

--Creatie databank Bibliotheek
CREATE DATABASE MijnFilms
GO

USE MijnFilms
GO

--Creatie tabel AUTEUR   
CREATE TABLE ACTEUR(
    Acteur_id int NOT NULL,
    ActeurNaam nvarchar(40),
    CONSTRAINT PK_Acteur PRIMARY KEY(acteur_id)
) 
GO

--Creatie tabel CATEGORIE  
CREATE TABLE CASTING(
    Film_id int NOT NULL,
    Acteur_id int NOT NULL,
    CONSTRAINT PK_Casting PRIMARY KEY(Film_id),
    CONSTRAINT FK1_Casting FOREIGN KEY(Acteur_id) REFERENCES Acteur(acteur_id)
) 
GO


--Creatie tabel BOEKEN   
CREATE TABLE FILM(
    Film_id int NOT NULL,
    Titel nvarchar(40),
    Jaar smallint,
    Score int,
    Stemmen int,
    CONSTRAINT FK1_Film FOREIGN KEY(Film_id) REFERENCES Casting(film_id),
) 
GO



--Opvullen van de tabellen met testdata 
INSERT INTO ACTEUR(Acteur_id, ActeurNaam) VALUES (1, 'Tom Hanks')
INSERT INTO ACTEUR(Acteur_id, ActeurNaam) VALUES (2, 'Hellen Hunt')
INSERT INTO ACTEUR(Acteur_id, ActeurNaam) VALUES (3, 'Catherine Zeta Jones')

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

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

并且目前获得Msg 2627,第14级,状态1,第60行违反PRIMARY KEY约束“ PK_Casting”。无法在对象“ dbo.CASTING”中插入重复密钥。重复的键值为(2)。

sql sql-server ssms
3个回答
0
投票

嗯,您试图将film_id(和1)的2两次插入casting,但是主键必须唯一。

您可以在此处使用复合主键,包括电影的ID和演员的ID。

[胶片的ID也应该是film中的主键,而casting中是外键,反之亦然。但这需要在film之前创建casting。这也适用于INSERT-film必须先于casting

...
CREATE TABLE film
             (film_id integer
                      NOT NULL,
              titel nvarchar(40),
              jaar smallint,
              score integer,
              stemmen integer,
              CONSTRAINT pk_film
                         PRIMARY KEY (film_id));

CREATE TABLE acteur
             (acteur_id integer
                        NOT NULL,
              acteurnaam nvarchar(40),
              CONSTRAINT pk_acteur
                         PRIMARY KEY (acteur_id));

CREATE TABLE casting
             (film_id integer
                      NOT NULL,
              acteur_id integer
                        NOT NULL,
              CONSTRAINT pk_casting
                         PRIMARY KEY (film_id,
                                      acteur_id),
              CONSTRAINT fk1_casting
                         FOREIGN KEY (film_id)
                                     REFERENCES film
                                                (film_id),
              CONSTRAINT fk2_casting
                         FOREIGN KEY (acteur_id)
                                     REFERENCES acteur
                                                (acteur_id));
...

INSERT INTO film ...

INSERT INTO acteur ...

INSERT INTO casting ...

-1
投票

在表CASTING中,您将Film_id设置为主键,这意味着该列中的所有值都必须是唯一的。

您需要删除此约束:

CONSTRAINT PK_Casting PRIMARY KEY(Film_id)

然后,您将可以像现在一样为Film_id列插入相同的值:

INSERT INTO CASTING (Film_id, Acteur_id) VALUES (1, 1)
INSERT INTO CASTING (Film_id, Acteur_id) VALUES (1, 2)
....

-1
投票
You are creating the table with constraints

CREATE TABLE CASTING(
    Film_id int NOT NULL,
    Acteur_id int NOT NULL,
    CONSTRAINT PK_Casting PRIMARY KEY(Film_id),
    CONSTRAINT FK1_Casting FOREIGN KEY(Acteur_id) REFERENCES Acteur(acteur_id)
) 
GO

and Then ,you are inserting duplicated records in the table

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)


    You need to remove the constraint or you need to make COMPOSITE KEY by creating the  KEY on FILM_ID and ACTEUR_ID
© www.soinside.com 2019 - 2024. All rights reserved.