2011-12-12 20 views

risposta

30
ALTER TABLE YourTable MODIFY YourColumn DEFAULT NULL; 
+22

Questo non è completamente vero. Non si rimuove il valore predefinito impostato su 'NULL'. Il valore predefinito non può essere rimosso, i documenti Oracle dicono: "Se una colonna ha un valore predefinito, è possibile utilizzare la clausola DEFAULT per modificare l'impostazione predefinita su NULL, ma non è possibile rimuovere completamente il valore predefinito. mai assegnato un valore predefinito, quindi la colonna DATA_DEFAULT della vista del dizionario dati USER_TAB_COLUMNS visualizzerà sempre un valore predefinito o NULL. " –

+5

@ Michael-O È funzionalmente equivalente a quando non c'è 'DEFAULT'? (Se lo è, ci si deve chiedere perché non lo rendano coerente e internamente diano tutto un "DEFAULT" di 'NULL' di default. Come utente finale, non dovrei preoccuparmi di dettagli interni come quello .) – jpmc26

+4

@ jpmc26, hai ragione che sono * funzionalmente * equivalenti.Tuttavia, ci sono casi in cui [influenza l'output dell'introspezione del database, come ho scritto nella mia risposta] (http://stackoverflow.com/a/37265135/20789). (Questo è solo uno dei tanti casi stupidi che mi portano a concludere che Oracle è un database estremamente ostico per programmatori.) –

4

L'unico modo per fare ciò che si desidera è ricreare il tavolo.

È abbastanza facile farlo in rospo, è sufficiente fare clic con il tasto destro sul tavolo e selezionare "Ricostruisci tabella". Toad creerà uno script che rinomina la tabella e ricrea una nuova tabella. Lo script ricreerà indici, vincoli, chiavi esterne, commenti, ecc. E popolerà la tabella con i dati.

Basta modificare lo script per rimuovere "default null" dopo la colonna in questione.

+1

Uno può rilasciare la colonna e quindi aggiungerla di nuovo. 'ALTER TABLE mytable DROP COLUMN mycolumn; ALTER TABLE mytable ADD mycolumn DATE; ' –

+1

Questo funziona, l'unico problema è che sposterà la colonna nella parte inferiore dell'elenco. Se si desidera conservare l'ordine delle colonne, rilasciare e ricreare la tabella. –

7

Joe's answer è corretta nel senso che una colonna con DEFAULT NULL è funzionalmente equivale ad avere mai definito un valore predefinito per quella colonna in primo luogo: se una colonna non ha un valore predefinito, l'inserimento di una nuova riga senza specificare il valore per quella colonna risulta in NULL.

Tuttavia, Oracle rappresenta internamente i due casi distintamente, come si può vedere osservando la ALL_TAB_COLUMNS system view *

  1. Il caso in cui è stata creata una colonna, o ALTER ed, con DEFAULT NULL.:

    create table foo (bar varchar2(3) default null); 
    
    select default_length, data_default from all_tab_columns where table_name='FOO'; 
    
    => default_length data_default 
        -------------- ------------ 
        4     NULL 
    
    select dbms_metadata.get_ddl('TABLE','FOO') from dual; 
    
    => CREATE TABLE "FOO" 
        ( "BAR" VARCHAR(3) DEFAULT NULL 
         … 
        ) 
    
  2. No predefinito mai specificato:

    create table foo (bar varchar2(3)); 
    
    select default_length, data_default from all_tab_columns where table_name='FOO'; 
    
    => default_length data_default 
        -------------- ------------ 
        (null)   (null) 
    
    select dbms_metadata.get_ddl('TABLE','FOO') from dual; 
    
    => CREATE TABLE "FOO" 
        ( "BAR" VARCHAR(3) 
         … 
        ) 
    

Come indicato sopra, v'è un caso importante in cui questa distinzione insignificante fa la differenza nell'uscita Oracle: quando si utilizza DBMS_METADATA.GET_DDL() per estrarre la definizione della tabella.

Se si utilizza GET_DDL() per introspezione del database, quindi si otterrà un po 'diverso di uscita DDL per funzionalmente identici tabelle.

Questo è davvero piuttosto fastidioso quando si utilizza GET_DDL() per il controllo della versione e il confronto tra più istanze di un database e non c'è modo di evitarlo, oltre a modificare manualmente l'output di GET_DDL() o per ricreare completamente la tabella con nessun valore predefinito.

* Almeno per Oracle 10g, 11g e 12c.

+0

Darei un'occhiata a DROP DEFAULT; Non so se è esattamente uguale a null di default ma sembra più specifico. –

+0

A partire da Oracle 12, non ha 'DROP DEFAULT' ☹. Questo è esattamente il problema e il motivo per cui abbiamo bisogno di aggirarlo con un 'DEFAULT NULL'. (Qualsiasi riferimento a 'DROP DEFAULT' che si trova su oracle.com è probabilmente correlato a MySQL ... che è un database completamente separato ora di proprietà di Oracle.) –

Problemi correlati