Come inserire una colonna in una posizione specifica in oracle senza cadere e ricreare la tabella?

Ho uno scenario specifico in cui devo inserire due nuove colonne in una tabella esistente in Oracle. Non posso fare il drop e ricreare il tavolo. Quindi può essere raggiunto con qualsiasi mezzo ??

Amit-

Non credo che si possa aggiungere una colonna ovunque ma alla fine della tabella una volta creata la tabella. Una soluzione potrebbe essere quella di provare questo:

CREATE TABLE MY_TEMP_TABLE AS SELECT * FROM TABLE_TO_CHANGE; 

Rilascia la tabella a cui vuoi aggiungere colonne:

 DROP TABLE TABLE_TO_CHANGE; 

È al punto che puoi ribuild il tavolo esistente da zero aggiungendo nelle colonne dove desideri. Supponiamo che per questo esercizio tu voglia aggiungere le colonne “COL2 e COL3”.

Ora inserisci i dati nella nuova tabella:

 INSERT INTO TABLE_TO_CHANGE (COL1, COL2, COL3, COL4) SELECT COL1, 'Foo', 'Bar', COL4 FROM MY_TEMP_TABLE; 

Quando i dati vengono inseriti nella tabella “new-old”, è ansible rilasciare la tabella temporanea.

 DROP TABLE MY_TEMP_TABLE; 

Questo è spesso ciò che faccio quando voglio aggiungere colonne in una posizione specifica. Ovviamente, se si tratta di un sistema di produzione on-line, probabilmente non è pratico, ma solo una potenziale idea.

CJ

Tu (ancora) non puoi scegliere la posizione della colonna usando ALTER TABLE: può essere aggiunta solo alla fine della tabella. Ovviamente puoi selezionare le colonne in qualsiasi ordine tu voglia, quindi a meno che tu non stia usando l’ordine SELECT * FROM non dovrebbe essere un grosso problema.

Se davvero devi averli in un ordine particolare e non puoi eliminare e ricreare la tabella, potresti invece eliminare e ricreare colonne:

Prima copia il tavolo

 CREATE TABLE my_tab_temp AS SELECT * FROM my_tab; 

Quindi rilascia colonne che desideri dopo la colonna che inserirai

 ALTER TABLE my_tab DROP COLUMN three; 

Ora aggiungi la nuova colonna (due in questo esempio) e quelli che hai rimosso.

 ALTER TABLE my_tab ADD (two NUMBER(2), three NUMBER(10)); 

Infine aggiungi nuovamente i dati per le colonne ricreate

 UPDATE my_tab SET my_tab.three = (SELECT my_tab_temp.three FROM my_tab_temp WHERE my_tab.one = my_tab_temp.one); 

Ovviamente il tuo aggiornamento sarà molto più complesso e dovrai gestire indici e vincoli e non sarà in grado di usarlo in alcuni casi (colonne LOB, ecc.). Inoltre, questo è un modo piuttosto orribile per farlo – ma la tabella esisterà sempre e ti ritroverai con le colonne nell’ordine che desideri. Ma l’ordine delle colonne è davvero così importante?

Anche se questo è piuttosto vecchio, vorrei aggiungere una versione leggermente migliorata che cambia davvero l’ordine delle colonne. Ecco i passaggi (supponendo di avere una tabella TAB1 con colonne COL1, COL2, COL3):

  1. Aggiungi una nuova colonna alla tabella TAB1:
 alter table TAB1 add (NEW_COL number); 
  1. “Copia” tabella in nome temp cambiando l’ordine delle colonne E rinomina la nuova colonna:
 create table tempTAB1 as select NEW_COL as COL0, COL1, COL2, COL3 from TAB1; 
  1. rilascia la tabella esistente:
 drop table TAB1; 
  1. rinominare temp tablename appena cancellato tablename:
 rename tempTAB1 to TAB1; 

Fai come questo:

 alter table TABLE_NAME (COLUMN_NAME DATA_TYPE); 

Una nuova colonna verrà aggiunta alla fine della tabella.