我正在尝试通过脚本添加新的数据库,但遇到一些错误,已经准备好放出双重假象,但这对我不起作用。
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)。
嗯,您试图将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 ...
在表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)
....
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