【问题标题】:Violation of PRIMARY KEY constraint PK_Casting违反 PRIMARY KEY 约束 PK_Casting
【发布时间】:2020-09-17 22:24:36
【问题描述】:

我正在尝试通过脚本添加新的数据库,但出现了一些错误,已经尝试释放双字段,但这对我不起作用。

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, 'Helen 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

现在,我收到一个错误:

消息 2627,第 14 级,状态 1,第 60 行
违反主键约束“PK_Casting”。无法在对象“dbo.CASTING”中插入重复键。重复键值为 (2)。

【问题讨论】:

  • 错误告诉你问题所在。 Film_idCASTING 中的主键,但您尝试将 INSERT12 两次;因此第二次尝试为film_id 插入1 会导致重复键。

标签: sql sql-server ssms


【解决方案1】:

好吧,您尝试将film_id1(和2)插入casting 两次,但主键必须是唯一的。

您可以在此处使用复合主键,由电影 ID 和演员 ID 组成。

此外,电影的 ID 应该是 film 中的主键和 casting 中的外键,而不是相反。这需要在 casting 之前创建 film。这也适用于 INSERTs -- 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 ...

【讨论】:

    【解决方案2】:

    您正在创建带有约束的表

    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
    

    然后你在表中插入重复的记录

    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)
    

    您需要删除约束,或者您需要通过在FILM_IDACTEUR_ID 上创建密钥来制作 COMPOSITE KEY

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-07-07
      相关资源
      最近更新 更多