PostgreSQL在引用端自动分配外键

时间:2013-11-04 20:01:00

标签: sql database postgresql

所以我有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会自动在主键和唯一约束上创建索引,但不在外键关系的引用方面。

2 个答案:

答案 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_idmovie_id actor_in_movie上的索引。

更多详情:

答案 1 :(得分:3)

这只是bigserial完全按照宣传的方式工作。它与外键约束或索引无关。