所以我有Table ActorInMovies,它有3个外键。
CREATE TABLE ActorInMovie(
ID_ROLE bigserial REFERENCES Role(ID_ROLE) ON DELETE CASCADE,
ID_ACTOR bigserial REFERENCES Actor(ID_Actor) ON DELETE CASCADE,
ID_MOVIE bigserial REFERENCES Movie(ID_Movie) ON DELETE CASCADE,
CONSTRAINT ActorInMovie_pk PRIMARY KEY (ID_ROLE));
我认为当我尝试插入类似的内容时:
INSERT INTO ActorInMovie (ID_ROLE, ID_ACTOR) values (1,1);
它会导致错误,因为未指定ID_MOVIE(我认为是null)..但它会自动开始分配从1开始的索引。
我做错了什么?正如here所写,我认为“PostgreSQL会自动在主键和唯一约束上创建索引,但不在外键关系的引用方面。”
答案 0 :(得分:5)
我很难想象一个serial
(or bigserial
)列引用另一列的用例。它通常是相反的:serial
列应该放在外键约束的另一端。
我同样很难想象一个设计,其中movie_id
需要bigint
而不仅仅是int
。这个星球上没有足够的电影。
此外,很有可能,名为movie_id
的表中名为actor_in_movie
的列应定义为NOT NULL
。
简而言之:我怀疑你的设计完全 。也许是这样的:
CREATE TABLE actor (actor_id serial PRIMARY KEY, actor text, ...);
CREATE TABLE movie (movie_id serial PRIMARY KEY, movie text, ...);
CREATE TABLE actor_in_movie(
role_id serial PRIMARY KEY
,actor_id int NOT NULL REFERENCES actor(actor_id) ON DELETE CASCADE
,movie_id int NOT NULL REFERENCES movie(movie_id) ON DELETE CASCADE
);
NOT NULL
约束是多余的,而列包含在主键中。
您可能希望actor_id
和movie_id
actor_in_movie
上的索引。
更多详情:
答案 1 :(得分:3)
这只是bigserial
完全按照宣传的方式工作。它与外键约束或索引无关。