flyway和postgresql可空外键定义仍然生成非空约束

3qpi33ja  于 2021-07-23  发布在  Java
关注(0)|答案(1)|浏览(338)

我将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-nullPERSON 以及 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
t40tm48m

t40tm48m1#

"8.1.4. “序列类型”:
数据类型 smallserial , serial 以及 bigserial 不是真正的类型,只是创建唯一标识符列(类似于 AUTO_INCREMENT 属性)。在当前实现中,指定:

CREATE TABLE tablename (
    colname SERIAL
);

相当于指定:

CREATE SEQUENCE tablename_colname_seq AS integer;
CREATE TABLE tablename (
    colname integer NOT NULL DEFAULT nextval('tablename_colname_seq')
);
ALTER SEQUENCE tablename_colname_seq OWNED BY tablename.colname;

注意 NOT NULL .
不要使用 bigserial 对于外键。那没什么意义。简单使用 bigint .

CREATE TABLE IF NOT EXISTS person
                           (...
                            role bigint REFERENCES role);

相关问题