Определение ограничения NULL-значений
Спецификация

См. спецификацию пункта «Создание таблицы».

Синтаксические правила
  1. Если <​ограничение NULL-значений​> явно не указано, по умолчанию используется NULL.

  2. Если задана конструкция <​имя столбца​> NULL, то для того же столбца нельзя задать NOT NULL или PRIMARY KEY.

  3. Если NOT NULL не указан и не задано <​значение по умолчанию​>, то подразумевается DEFAULT NULL.

  4. Разрешено сочетание описателей NOT NULL и DEFAULT NULL для столбца. В этом случае используется NOT NULL, а DEFAULT NULL игнорируется.

    create table tab1 (i int unique default null not null);
Общие правила
  1. Атрибут столбца NULL разрешает, NOT NULL запрещает присваивать значению столбца NULL-значения. По умолчанию используется NULL.

    create or replace table test (col1 int not null);
    insert into test(col1) values (100);
    insert into test(col1) values (null); /*ошибка */
    insert into test; /* ошибка */
  2. Атрибут NULL устанавливает значение по умолчанию для столбцов, значение которых не определено в операции добавления (модификации) записи и для которых не задана опция <​подставляемое значение​>.

    create or replace table test (col1 int null);
    insert into test(col1) values (100);
    insert into test(col1) values (null);
    insert into test;
    
    select NVL(col1,-1) from test;
    |        100|
    |         -1|
    |         -1|
  3. Если для столбца заданы одновременно <​ограничение NULL-значений​> и <​значение по умолчанию​>, то приоритет имеет опция <​ограничение NULL-значений​>.

    Например, в случаях

    create or replace table test (col1 int not null default null );
    
    create or replace table test (col1 int default null not null);

    будет применяться правило not null.

  4. <​Подставляемое значение столбца​> не должно конфликтовать с <​ограничением NULL-значений​>.

    create or replace table test (col1 int null,
     col2 int generated always as (col1+500) not null);
    
    insert into test(col1) values (100);
    insert into test(col1) values (null); // ошибка
    insert into test; // ошибка
    select * from test;