it-swarm.com.de

So legen Sie den Standardwert für die Spalte der neu erstellten Tabelle in der select-Anweisung in 11g fest

Ich erstelle eine Tabelle in Oracle 11g mit dem Standardwert für eine der Spalten. Die Syntax lautet:

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

Dies wurde erfolgreich erstellt. Aus bestimmten Gründen muss ich eine weitere Tabelle mit derselben alten Tabellenstruktur und denselben Daten erstellen. Also habe ich eine neue Tabelle mit dem Namen abc as erstellt

create table abc as select * from xyz. 

Hier wurde "abc" erfolgreich mit der gleichen Struktur und den gleichen Daten wie die alte Tabelle xyz erstellt. Für die Spalte "Gehalt" in der alten Tabelle "xyz" wurde der Standardwert auf "0" gesetzt. In der neu erstellten Tabelle "abc" ist der Standardwert jedoch nicht festgelegt.

Dies ist alles in Oracle 11g. Bitte nennen Sie mir den Grund, warum der Standardwert nicht festgelegt wurde und wie wir dies mit der select-Anweisung festlegen können.

21
gitee.com

Sie können die Einschränkungen und Standardwerte in einer CREATE TABLE AS SELECT-Anweisung angeben. Die Syntax lautet jedoch wie folgt

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;

Das heißt, die Einschränkungen werden nicht von der Quelltabelle/select übernommen. Nur der Datentyp (Länge/Genauigkeit/Skala) wird von der Auswahl bestimmt.

31
Gary Myers

Der Grund dafür ist, dass CTAS (Create table as select) keine Metadaten von der Quelle in die Zieltabelle kopiert, nämlich

  • kein Primärschlüssel
  • keine Fremdschlüssel
  • keine Stipendien
  • keine Indizes
  • ...

Um das zu erreichen, was Sie wollen, würde ich auch

  • verwenden Sie dbms_metadata.get_ddl, um die vollständige Tabellenstruktur abzurufen, ersetzen Sie den Tabellennamen durch den neuen Namen, führen Sie diese Anweisung aus und führen Sie anschließend ein INSERT aus, um die Daten zu kopieren
  • oder verwenden Sie weiterhin CTAS, extrahieren Sie die Nicht-Null-Einschränkungen für die Quelltabelle aus user_constraints und fügen Sie sie anschließend der Zieltabelle hinzu
9
Frank Schmitt

Sie müssen alter table abc modify (salary default 0);

6
Colin 't Hart

die neue Tabelle erbt nur die Einschränkung "nicht null" und keine andere Einschränkung. Daher können Sie die Tabelle nach dem Erstellen mit dem Befehl "Tabelle erstellen als" ändern oder alle Einschränkungen definieren, die Sie benötigen, indem Sie den Befehlen folgen

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

create table t2 as select * from t1;

Dadurch wird die Tabelle t2 ohne Null-Einschränkung erstellt. Für eine andere Einschränkung außer "nicht null" sollten Sie jedoch die folgende Syntax verwenden

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