我将spring boot和flyway用于以下初始化脚本:
CREATE TABLE ADDRESS(
ID bigserial NOT NULL PRIMARY KEY
);
CREATE TABLE ROLE(
ID bigserial NOT NULL PRIMARY KEY
);
CREATE TABLE PERSON(
ID bigserial NOT NULL PRIMARY KEY,
FIRST_NAME VARCHAR(255),
LAST_NAME VARCHAR(255),
ADDRESS bigserial NOT NULL REFERENCES ADDRESS (ID),
ROLE bigserial REFERENCES ROLE (ID) -- notice here is no 'not null'
);
表之间的所有关系是:
每个 PERSON
有
0-1 ROLE
. 所以,每个 ROLE
属于
0-n PERSON
. 因此,此关系可以为空。
每个 PERSON
有
1 ADDRESS
. 所以,每个 ADDRESS
属于
1-n PERSON
. 因此,这个关系不是空的。
一旦启动应用程序(我还尝试将查询直接发布到postgresql数据库模式),就会以某种方式生成约束 not-null
在 PERSON
以及 ROLE
table。
使用datagrip,我选择sqlscripts->generateddl来查询console并获取表的ddl(为了简洁起见,请参见下面的新行和角色定义)。
令我惊讶的是 NOT NULL
尽管我还没有定义这样的约束。除了换table外,如何处理它?
create table if not exists address
(
id bigserial not null
constraint address_pkey primary key
);
create table if not exists role
(
id bigserial not nullconstraint role_pkey primary key
);
create table if not exists person
(
id bigserial not null
constraint person_pkey primary key,
first_name varchar(255),
last_name varchar(255),
address bigserial not null
constraint person_address_fkey references address,
role bigserial not null -- why is 'not null' here?
constraint person_role_fkey references role
);
我使用的postgresql版本(通过 SELECT version()
)是:
PostgreSQL 10.13, compiled by Visual C++ build 1800, 64-bit
1条答案
按热度按时间t40tm48m1#
"8.1.4. “序列类型”:
数据类型
smallserial
,serial
以及bigserial
不是真正的类型,只是创建唯一标识符列(类似于AUTO_INCREMENT
属性)。在当前实现中,指定:相当于指定:
注意
NOT NULL
.不要使用
bigserial
对于外键。那没什么意义。简单使用bigint
.