PostgreSQL在引用端自动分配外键

PostgreSQL在引用端自动分配外键,sql,database,postgresql,Sql,Database,Postgresql,我有一个表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 CA

我有一个表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);
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
);
我想这会导致一个错误,因为ID_MOVIE没有指定为null。。但它会自动开始从1开始分配索引


我做错了什么?如前所述,我认为PostgreSQL会自动在主键和唯一约束上创建索引,但不会在外键关系的引用端创建索引

这只是完全按照广告宣传的那样工作。它与外键约束或索引无关。

我很难想象一个列引用另一列的用例。通常情况相反:序列列应该位于外键约束的另一端

我同样很难想象一个设计,一部电影的id应该是bigint而不仅仅是int。这个星球上几乎没有足够的电影

另外,很有可能,在名为actor\u in\u movie的表中,名为movie\u id的列应该定义为NOTNULL

简言之:我对你的设计毫无疑问。可能是这样的:

INSERT INTO ActorInMovie (ID_ROLE, ID_ACTOR) values (1,1);
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
);
当列包含在主键中时,NOTNULL约束是多余的

您可能需要演员id和电影中演员id的索引

更多详情:


哦我以为bigserial只有在没有参考资料的情况下才会这么做。。谢谢我想你正中要害!我刚从数据库开始,认为bigserial是一种数据类型,不可能转换为int。你写的正是我想要实现的。幸运的是,这只是一个学者的例子,所以没有造成伤害。谢谢大家!@KubaSpatny:您可能对这个密切相关的答案感兴趣,并提供了更多的解释和链接: