Как убрать DEFAULT-значение из определения столбца?

Всё по теме СУБД Oracle: установка, настройка, использование, решение проблем и т.д. и т.п. и др. и пр.
Ответить
Аватара пользователя
SQL*Plus
Сообщения: 208
Зарегистрирован: Ср апр 20, 2022 1:09 pm

Как убрать DEFAULT-значение из определения столбца?

Сообщение SQL*Plus »

Версия базы:

Код: Выделить всё

Oracle Database 12c Enterprise Edition Release 12.1.0.2.0 - 64bit Production

Создал таблицу:

Код: Выделить всё

SQL> CREATE TABLE killme_test(
  2     ID NUMBER(9)
  3   , name VARCHAR2(10 CHAR)
  4   , TEXT VARCHAR2(30 CHAR) DEFAULT 'Default text');
Table KILLME_TEST created.
Проверил определение столбцов и значение по умолчанию (data_default) для столбца TEXT:

Код: Выделить всё

SQL> COLUMN table_name FORMAT A12;
SQL> COLUMN column_name FORMAT A12;
SQL> COLUMN data_type FORMAT A12;
SQL> COLUMN data_default FORMAT A20;
SQL> 
SQL> SELECT table_name, column_name, data_type, data_length, default_length, data_default 
  2  FROM user_tab_columns WHERE table_name = 'KILLME_TEST' ORDER BY column_id;

TABLE_NAME   COLUMN_NAME  DATA_TYPE    DATA_LENGTH DEFAULT_LENGTH DATA_DEFAULT        
------------ ------------ ------------ ----------- -------------- --------------------
KILLME_TEST  ID           NUMBER                22                                    
KILLME_TEST  NAME         VARCHAR2              40                                    
KILLME_TEST  TEXT         VARCHAR2             120             14 'Default text'  
Всё ОК. Так и было создано.

Решил убрать значение по умолчанию.
То есть сделать так же, как у столбца NAME.

Попытка-1:

Код: Выделить всё

SQL> ALTER TABLE killme_test
  2     MODIFY TEXT VARCHAR2(30 CHAR) DEFAULT NULL;
Table KILLME_TEST altered.

SQL> SELECT table_name, column_name, data_type, data_length, default_length, data_default 
  2  FROM user_tab_columns WHERE table_name = 'KILLME_TEST' ORDER BY column_id;

TABLE_NAME   COLUMN_NAME  DATA_TYPE    DATA_LENGTH DEFAULT_LENGTH DATA_DEFAULT        
------------ ------------ ------------ ----------- -------------- --------------------
KILLME_TEST  ID           NUMBER                22                                    
KILLME_TEST  NAME         VARCHAR2              40                                    
KILLME_TEST  TEXT         VARCHAR2             120              4 NULL   
Не получилось: в DATA_DEFAULT видим NULL и DEFAULT_LENGTH = 4.

Попытка-2:

Код: Выделить всё

SQL> ALTER TABLE killme_test
  2     MODIFY TEXT VARCHAR2(30 CHAR) DEFAULT '';
Table KILLME_TEST altered.

SQL> SELECT table_name, column_name, data_type, data_length, default_length, data_default 
  2  FROM user_tab_columns WHERE table_name = 'KILLME_TEST' ORDER BY column_id;

TABLE_NAME   COLUMN_NAME  DATA_TYPE    DATA_LENGTH DEFAULT_LENGTH DATA_DEFAULT        
------------ ------------ ------------ ----------- -------------- --------------------
KILLME_TEST  ID           NUMBER                22                                    
KILLME_TEST  NAME         VARCHAR2              40                                    
KILLME_TEST  TEXT         VARCHAR2             120              2 ''                  
Не получилось: в DATA_DEFAULT видим '' (два апострофа) и DEFAULT_LENGTH = 2.

Вопрос:
Как сделать так, чтобы не было ничего?
Так же, как у столбца NAME.
Вот так:
DEFAULT_LENGTH = <ничего>
DATA_DEFAULT = <ничего>
Аватара пользователя
SQL*Plus
Сообщения: 208
Зарегистрирован: Ср апр 20, 2022 1:09 pm

Re: Как убрать DEFAULT-значение из определения столбца?

Сообщение SQL*Plus »

Проверил на версии:

Код: Выделить всё

Oracle Database 21c Enterprise Edition Release 21.0.0.0.0 - Production
Version 21.4.0.0.0 
Результат тот же.
pluzanov
Сообщения: 44
Зарегистрирован: Пт июл 08, 2022 4:43 pm

Re: Как убрать DEFAULT-значение из определения столбца?

Сообщение pluzanov »

Описания стандарта SQL нет под рукой, но в PostgreSQL это делается командой
ALTER TABLE .. ALTER COLUMN .. DROP DEFAULT

Код: Выделить всё

postgres@postgres(12.12)=# create table t (id int, col text default 'Default text');
CREATE TABLE
postgres@postgres(12.12)=# insert into t (id) values (1) returning *;
 id |     col      
----+--------------
  1 | Default text
(1 row)

INSERT 0 1
postgres@postgres(12.12)=# \d t
                        Table "public.t"
 Column |  Type   | Collation | Nullable |       Default        
--------+---------+-----------+----------+----------------------
 id     | integer |           |          | 
 col    | text    |           |          | 'Default text'::text

postgres@postgres(12.12)=# alter table t alter column col drop default;
ALTER TABLE
postgres@postgres(12.12)=# insert into t (id) values (2) returning *;
 id | col 
----+-----
  2 | 
(1 row)

INSERT 0 1
postgres@postgres(12.12)=# \d t
                 Table "public.t"
 Column |  Type   | Collation | Nullable | Default 
--------+---------+-----------+----------+---------
 id     | integer |           |          | 
 col    | text    |           |          | 
Аватара пользователя
SQL*Plus
Сообщения: 208
Зарегистрирован: Ср апр 20, 2022 1:09 pm

Re: Как убрать DEFAULT-значение из определения столбца?

Сообщение SQL*Plus »

pluzanov писал(а): Пт окт 14, 2022 9:26 pm Описания стандарта SQL нет под рукой, но в PostgreSQL это делается командой
ALTER TABLE .. ALTER COLUMN .. DROP DEFAULT
Нормальное естественное решение.
(что предписывает стандарт, я не знаю - стандарта тоже нет под рукой.

А в одном Телеграм-чате по Ораклу мне ответили:
One if MOS Notes:

This is an expected behavior , as per documentation :-
"If a column has a default value, then you can use the DEFAULT clause to change the default to NULL, but you cannot remove the default value completely. If a column has ever had a default value assigned to it, then the DATA_DEFAULT column of the USER_TAB_COLUMNS data dictionary view will always display either a default value or NULL."

Этого в доке я не нашел. наверное уже выпилили. Но судя по всему справедливо до сих пор.
Я нашел это в доке на Oracle 10.2 https://docs.oracle.com/cd/B19306_01/se ... s_3001.htm

В более поздних версиях документации такой текст не встречается.

В моём "переводе" это означает:
"Так уж у нас исторически сложилось. Терпите. Может быть когда-нибудь исправим."
Аватара пользователя
SQL*Plus
Сообщения: 208
Зарегистрирован: Ср апр 20, 2022 1:09 pm

Re: Как убрать DEFAULT-значение из определения столбца?

Сообщение SQL*Plus »

Пересоздать таблицу для того, чтобы убрать DEFAULT-значение - это сильный ход!
Это почти то же самое, что вырезать гланды автогеном, хотя и через рот...

Будем надеяться, что когда-нибудь эту простую задачу Oracle решит.
Ответить