繁体   English   中英

为什么在标识列上出现外键不唯一错误?

[英]Why do I get a foreign key not unique error on an identity column?

如果我尝试在 PostgreSQL 14.3 中创建两个这样的表:

CREATE TABLE IF NOT EXISTS foo (
  id INT4 GENERATED BY DEFAULT AS IDENTITY (INCREMENT BY 1 MINVALUE -2147483648 START -2147483648),
  foo TEXT UNIQUE NOT NULL
);

CREATE TABLE IF NOT EXISTS bar (
  id INT4 GENERATED BY DEFAULT AS IDENTITY (INCREMENT BY 1 MINVALUE -2147483648 START -2147483648),
  foo_id INT4 NOT NULL REFERENCES foo(id)
);

我得到这个 output:

$ psql test -f bug01.sql
CREATE TABLE
psql:bug01.sql:9: ERROR:  there is no unique constraint matching given keys for referenced table "foo"

我认为GENERATED BY DEFAULT AS IDENTITY会满足唯一性约束。 我错过了什么? 我该如何解决这个问题?


更新:应用 Bergi 的回答和评论,我向每个标识列添加了一个主键约束并解决了问题:

CREATE TABLE IF NOT EXISTS foo (
  id INT4 PRIMARY KEY GENERATED BY DEFAULT AS IDENTITY (INCREMENT BY 1 MINVALUE -2147483648 START -2147483648),
  foo TEXT UNIQUE NOT NULL
);

CREATE TABLE IF NOT EXISTS bar (
  id INT4 PRIMARY KEY GENERATED BY DEFAULT AS IDENTITY (INCREMENT BY 1 MINVALUE -2147483648 START -2147483648),
  foo_id INT4 NOT NULL REFERENCES foo(id)
);
$ psql test -f bug01.sql
CREATE TABLE
CREATE TABLE

谢谢!

好吧,不。GENERATED只是意味着它比DEFAULT值更难覆盖(需要特殊语法),而AS IDENTITY只是一种定义隐式序列的奇特方式,类似于SERIAL

您仍然可以通过重置序列或使用OVERRIDING SYSTEM VALUE在您的列中插入重复项,您必须声明适当的约束以防止这种情况发生。 只需将您的id设为表的PRIMARY KEY

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM