I use Spring Boot and Flyway with this initialization script:
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'
);
All the relationship between the tables is that:
- Each PERSONhas0-1ROLE. So, eachROLEbelongs to0-nPERSON. Hence, this relationship is nullable.
- Each PERSONhas1ADDRESS. So, eachADDRESSbelongs to1-nPERSON. Hence, this relationship is not-null.
As soon as I start the application (I have also tried to post the query straight to the PostgreSQL database schema), there is somehow generated constraint not-null between the PERSON and ROLE tables.
Using DataGrip, I select SQL Scripts -> Generate DDL to Query Console and get the DDL for the tables (see below, new lines and roles definitions omitted for sake of brevity).
To my surprise, the NOT NULL is there although I haven't defined such constraint. How to get rid of it aside from altering 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
);
The version of PostgreSQL I use (through SELECT version()) is:
PostgreSQL 10.13, compiled by Visual C++ build 1800, 64-bit
 
     
    