Как установить значение по умолчанию для столбца новой созданной таблицы из оператора select в 11g - PullRequest
20 голосов
/ 09 мая 2011

Я создаю таблицу в Oracle 11g со значением по умолчанию для одного из столбцов.Синтаксис:

create table xyz(emp number,ename varchar2(100),salary number default 0);

Это успешно создано.По некоторым причинам мне нужно создать другую таблицу с такой же старой структурой таблицы и данными.Поэтому я создал новую таблицу с именем abc как

create table abc as select * from xyz. 

Здесь "abc" успешно создан с той же структурой и данными, что и у старой таблицы xyz.Но для столбца «зарплата» в старой таблице «xyz» значение по умолчанию было установлено на «0».Но во вновь созданной таблице «abc» значение по умолчанию не установлено.

Это все в Oracle 11g.Скажите, пожалуйста, причину, по которой значение по умолчанию не было установлено, и как мы можем установить это с помощью оператора select.

Ответы [ 4 ]

30 голосов
/ 10 мая 2011

Вы можете указать ограничения и значения по умолчанию в CREATE TABLE AS SELECT, но синтаксис следующий:

create table t1 (id number default 1 not null);
insert into t1 (id) values (2);

create table t2 (id default 1 not null)
as select * from t1;

То есть он не будет наследовать ограничения от исходной таблицы / select. Только тип данных (длина / точность / масштаб) определяется выбором.

8 голосов
/ 09 мая 2011

Причина в том, что CTAS (Создать таблицу как выбор) не копирует никакие метаданные из источника в целевую таблицу, а именно:

  • без первичного ключа
  • без внешних ключей
  • без грантов
  • без индексов
  • ...

Чтобы достичь того, что вы хотите, я либо

  • используйте dbms_metadata.get_ddl, чтобы получить полную структуру таблицы, замените имя таблицы новым именем, выполните этот оператор, а затем выполните INSERT для копирования данных
  • или продолжайте использовать CTAS, извлеките ненулевоеограничения для исходной таблицы из user_constraints и добавление их к целевой таблице впоследствии
5 голосов
/ 09 мая 2011

Вам нужно будет alter table abc modify (salary default 0);

1 голос
/ 10 января 2014

новая таблица наследует только ограничение "не ноль" и никаких других ограничений.Таким образом, вы можете изменить таблицу после ее создания с помощью команды «создать таблицу как» или определить все необходимые ограничения, выполнив

create table t1 (id number default 1 not null);
insert into t1 (id) values (2);

create table t2 as select * from t1;

. Это создаст таблицу t2 с ненулевым ограничением.Но для некоторых других ограничений, кроме «not null», вы должны использовать следующий синтаксис

create table t1 (id number default 1 unique);
insert into t1 (id) values (2);

create table t2 (id default 1 unique)
as select * from t1;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...