PostgreSQL在引用端自动分配外键
我有一个表ActorInMovies,它有3个外键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
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:您可能对这个密切相关的答案感兴趣,并提供了更多的解释和链接: