Oracle - Добавление ограничения NOT NULL к столбцу, допускающему в настоящее время значение NULL - PullRequest
0 голосов
/ 04 августа 2020

У меня есть несколько полей numeri c, которые в настоящее время допускают значение NULL. Я хочу добавить в эти поля ограничение NOT NULL и установить значение по умолчанию на 0.

Данные помещаются в эту таблицу по расписанию. В эти поля ничего не помещается, и они допускают значение NULL, поэтому все эти определенные поля устанавливаются в NULL. Это вызывает некоторые проблемы, когда мы пытаемся произвести математические вычисления с этими полями.

Если я сначала запустил обновления в этих полях, чтобы установить все текущие нули в нули, возникнут ли у меня проблемы с добавлением NOT NULL с ограничением по умолчанию 0 для этих полей, допускающих в настоящее время значение NULL? Есть ли что-нибудь, на что мне следует обратить внимание?

Спасибо

отредактируйте:

SET SERVEROUTPUT ON
DECLARE
  P_PROJECT_NUM VARCHAR2(200);
  P_FISCAL_YEAR VARCHAR2(200);
  P_RESP_CENTER VARCHAR2(200);
  FIELD1 INTEGER;
  FIELD2 INTEGER;
  FIELD3 INTEGER;

BEGIN
  P_PROJECT_NUM := '123456';
  P_FISCAL_YEAR := '2019_2020';
  P_RESP_CENTER := '123A';
  FIELD1 := 0;
  FIELD2 := 0;
  FIELD3 := 0;

  FMS_EXTRACT.LOAD_TEMPLATE(
    P_PROJECT_NUM => P_PROJECT_NUM,
    P_FISCAL_YEAR => P_FISCAL_YEAR,
    P_RESP_CENTER => P_RESP_CENTER,
    FIELD1 => FIELD1,
    FIELD2 => FIELD2,
    FIELD3 => FIELD3
  );

COMMIT;

Ответы [ 2 ]

0 голосов
/ 04 августа 2020

Это слишком долго для комментария. Я не думаю, что вам нужно ограничение NOT NULL. Это приведет к тому, что ваши вставки не будут выполнены, если любые столбцы NOT NULL будут NULL.

Самое простое решение - не изменять данные вообще. В конце концов, NULL кажется допустимым значением, если данные поступают именно так. Просто используйте COALESCE() в своем logi c:

select coalesce(x, 0) + coalesce(y, 0)

Вы можете охватить это logi c в представлении или в сгенерированных столбцах:

alter table t add x_notnull generated always as (coalesce(x, 0));

Если вы хотите предотвратить поступление строк со значениями NULL, вы можете отфильтровать их в процессе, важном для данных. Вы не предоставляете подробностей, поэтому я не могу вносить никаких предложений.

Вы можете добавить значение default. Например:

alter table modify y default 0;

Затем последующие insert s, где значение отсутствует , будут заменены значением по умолчанию. Однако явные значения NULL не будут затронуты.

Наконец, вы можете добавить ограничение NOT NULL - после удаления всех текущих значений NULL.

Здесь - скрипт db <>, показывающий некоторые примеры вышеперечисленного.

0 голосов
/ 04 августа 2020

Вы можете сделать это так

  • Добавить предложение по умолчанию в столбцы
  • Обновить нулевые значения до 0
  • Добавить ограничение NOT NULL

Мой пример:

SQL> create table t ( c1 number , c2 number );

Table created.

SQL> insert into t values ( 1 , null ) ;

1 row created.

SQL> insert into t values ( null , 1 ) ;

1 row created.

SQL> select * from t ;

        C1         C2
---------- ----------
         1
                    1

SQL> alter table t modify c1 number default 0 ;

Table altered.

SQL>  alter table t modify c2 number default 0 ;

Table altered.

SQL> update t set c1 = 0 where c1 is null ;

1 row updated.

SQL> update t set c2 = 0 where c2 is null ;

1 row updated.

SQL> commit ;

Commit complete.

SQL> alter table t modify c1 number not null ;

Table altered.

SQL> alter table t modify c2 number not null ;

Table altered.

SQL> insert into t ( c1 ) values ( 2 ) ;

1 row created.

SQL> select * from t ;

        C1         C2
---------- ----------
         1          0
         0          1
         2          0
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...