web-dev-qa-db-fra.com

Comment définir la valeur par défaut pour la colonne de la nouvelle table créée à partir de l'instruction select en 11g

Je crée un tableau dans Oracle 11g avec la valeur par défaut pour l'une des colonnes. La syntaxe est:

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

Cela a réussi. Pour certaines raisons, je dois créer une autre table avec la même structure de table et les mêmes données anciennes. J'ai donc créé une nouvelle table avec le nom abc as

create table abc as select * from xyz. 

Ici "abc" créé avec succès avec la même structure et les mêmes données que l'ancienne table xyz. Mais pour la colonne "salaire" dans l'ancienne table "xyz", la valeur par défaut était "0". Mais dans la table nouvellement créée "abc", la valeur par défaut n'est pas définie.

Tout cela dans Oracle 11g. Veuillez me dire la raison pour laquelle la valeur par défaut n'a pas été définie et comment nous pouvons la définir à l'aide de l'instruction select.

21
gitee.com

Vous pouvez spécifier les contraintes et les valeurs par défaut dans CREATE TABLE AS SELECT, mais la syntaxe est la suivante

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;

Autrement dit, il n'héritera pas des contraintes de la table/sélection source. Seul le type de données (longueur/précision/échelle) est déterminé par la sélection.

31
Gary Myers

La raison en est que CTAS (Create table as select) ne copie aucune métadonnée de la source vers la table cible, à savoir

  • pas de clé primaire
  • pas de clés étrangères
  • pas de subventions
  • pas d'index
  • ...

Pour réaliser ce que vous voulez, je

  • utilisez dbms_metadata.get_ddl pour obtenir la structure complète de la table, remplacez le nom de la table par le nouveau nom, exécutez cette instruction et effectuez ensuite une INSERT pour copier les données
  • ou continuez à utiliser CTAS, extrayez les contraintes non nulles de la table source de user_constraints et ajoutez-les ensuite à la table cible
9
Frank Schmitt

Vous devrez alter table abc modify (salary default 0);

6
Colin 't Hart

la nouvelle table hérite uniquement de la contrainte "non nulle" et d'aucune autre contrainte. Ainsi, vous pouvez modifier la table après l'avoir créée avec la commande "créer la table en tant que" ou vous pouvez définir toutes les contraintes dont vous avez besoin en suivant la

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

create table t2 as select * from t1;

Cela créera la table t2 avec une contrainte non nulle. Mais pour une autre contrainte, sauf "non nul", vous devez utiliser la syntaxe suivante

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;
1
user3182853