Vraag Hoe verwijder ik de standaardwaarde uit een kolom in het orakel?


Een kolom in een tabel heeft een standaardwaarde van sysdate en ik wil deze wijzigen zodat deze geen standaardwaarde krijgt, hoe kan ik dit doen?


34
2017-12-12 22:04


oorsprong


antwoorden:


ALTER TABLE YourTable MODIFY YourColumn DEFAULT NULL;

32
2017-12-12 22:08



Joe's antwoord is correct in die zin dat een kolom met DEFAULT NULL is functioneel Dit komt overeen met het feit dat u nooit een standaardwaarde voor die kolom hebt gedefinieerd: als een kolom geen standaardwaarde heeft, resulteert het invoegen van een nieuwe rij zonder een waarde voor die kolom in te geven in NULL.

Echter, Oracle vertegenwoordigt intern de twee gevallen duidelijk, zoals te zien is aan de hand van de ALL_TAB_COLUMNS systeemweergave. *

  1. Het geval waarin een kolom is gemaakt, of ALTERed, met 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. Geen standaard ooit opgegeven:

    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)
            …
       )
    

Zoals hierboven getoond, is er een belangrijk geval waarbij dit betekenisloze onderscheid een verschil maakt in de uitvoer van Oracle: bij gebruik DBMS_METADATA.GET_DDL() om de tabeldefinitie te extraheren.

Als je gebruikt GET_DDL() om uw database te inspecteren, dan krijgt u iets andere DDL-uitvoer voor functioneel identieke tafels.

Dit is echt heel vervelend bij het gebruik GET_DDL() voor versiebeheer en vergelijking tussen meerdere exemplaren van een database, en er is geen manier om dit te voorkomen, behalve om handmatig de uitvoer van GET_DDL(), of om de tabel volledig opnieuw te maken zonder standaardwaarde.

* Tenminste voor Oracle 10g, 11g en 12c.


7
2018-05-17 00:15



De enige manier om te doen wat u wilt, is door de tabel opnieuw te maken.

Het is vrij eenvoudig om te doen in Toad, klik met de rechtermuisknop op de tafel en selecteer "Rebuild Table". Toad maakt een script dat de tabel hernoemt en een nieuwe tabel maakt. Het script maakt indexen, beperkingen, externe sleutels, opmerkingen, enz. Opnieuw en vult de tabel met gegevens.

Pas het script aan om "default null" te verwijderen na de betreffende kolom.


4
2018-05-13 00:14