Нарушение ограничения PRIMARY KEY PK_Casting - PullRequest
0 голосов
/ 30 мая 2020

Я пытаюсь добавить новую базу данных через скрипт, но получаю некоторые ошибки, уже пытался выдать двойные поля, но у меня это не сработало.

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

Верно теперь я получаю сообщение об ошибке:

Msg 2627, уровень 14, состояние 1, строка 60
нарушение ограничения PRIMARY KEY 'PK_Casting'. Невозможно вставить повторяющийся ключ в объект 'dbo.CASTING'. Повторяющееся значение ключа: (2).

Ответы [ 2 ]

1 голос
/ 30 мая 2020

Ну, вы пытаетесь вставить film_id из 12) в casting дважды, но первичные ключи должны быть уникальными.

Вы можете использовать составной первичный ключ здесь, состоящий из идентификатора фильма и актера.

Также идентификатор фильма должен быть первичным ключом в film и внешним ключом в casting, а не наоборот. Для этого требуется, чтобы film был создан до casting. Это также относится к INSERT s - 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 ...
0 голосов
/ 30 мая 2020

Вы создаете таблицу с ограничениями

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)

Вам нужно удалить ограничение или вам нужно сделать КОМПОЗИТ KEY, создав ключ на FILM_ID и ACTEUR_ID

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...