2012-08-08 14 views
47

Ich habe viele Male die folgende Syntax zu sehen, die eine Spalte in einer erstellen/verändern DDL-Anweisung definiert: dass die Spalte angeben, da ein Standardwert angegeben ist, ist es notwendig, auch:SQL-Spalte Definition: Standardwert und nicht null redundant?

ALTER TABLE tbl ADD COLUMN col VARCHAR(20) NOT NULL DEFAULT "MyDefault" 

Die Frage ist sollte NULL nicht akzeptieren? Mit anderen Worten, macht DEFAULT NOT NULL nicht redundant?

Antwort

69

DEFAULT erstellt wurde, ist der Wert, der in Abwesenheit eines expliziten Wert in einem Insert/Update-Anweisung eingefügt wird. Lassen Sie uns annehmen, haben Sie Ihre DDL nicht den NOT NULL Einschränkung:

ALTER TABLE tbl ADD COLUMN col VARCHAR(20) DEFAULT "MyDefault" 

Dann könnten Sie diese Anweisungen erteilen

-- 1. This will insert "MyDefault" into tbl.col 
INSERT INTO tbl (A, B) VALUES (NULL, NULL); 

-- 2. This will insert "MyDefault" into tbl.col 
INSERT INTO tbl (A, B, col) VALUES (NULL, NULL, DEFAULT); 

-- 3. This will insert "MyDefault" into tbl.col 
INSERT INTO tbl (A, B, col) DEFAULT VALUES; 

-- 4. This will insert NULL into tbl.col 
INSERT INTO tbl (A, B, col) VALUES (NULL, NULL, NULL); 

Alternativ können Sie auch DEFAULT in UPDATE Aussagen nach dem SQL-1992 Standard verwenden:

-- 5. This will update "MyDefault" into tbl.col 
UPDATE tbl SET col = DEFAULT; 

-- 6. This will update NULL into tbl.col 
UPDATE tbl SET col = NULL; 

Hinweis, nicht alle Datenbanken unterstützen alle diese SQL-Standardsyntaxen. Das Hinzufügen der NOT NULL-Einschränkung führt zu einem Fehler mit den Anweisungen 4, 6, während 1-3, 5 noch gültige Anweisungen sind. Also, um Ihre Frage zu beantworten:

Nein, NOT NULL und DEFAULT sind nicht redundant. Insbesondere NOT NULL can have a tremendous impact on query performance as explained in this blog post here

8

Auch mit einem Standardwert können Sie die Spaltendaten immer mit null überschreiben.

Die NOT NULL Einschränkung lassen Sie nicht die Zeile aktualisieren, nachdem es mit null Wert

+0

Ich denke, das umformuliert werden sollte: "Die NOT NULL Einschränkung werden Sie diese Zeile nicht zulassen, aktualisiert werden, nachdem es mit Nullwert erstellt wurde" Of Kurszeilen mit NOT NULL-Spalten können aktualisiert werden, sie können einfach nicht mit null als Wert für diese Spalte aktualisiert werden. Außerdem: Ich nehme an, dass das Erstellen einer Zeile das Einfügen einer Zeile bedeutet.INSERT-Anweisungen dürfen keine Nullwerte für Spalten haben, die ebenfalls mit NOT NULL angegeben sind. – makrom

0

würde ich nicht sagen.

Wenn die Spalte NULL-Werte akzeptiert, gibt es nichts, was Sie daran hindert, einen NULL-Wert in das Feld einzufügen. Soweit ich weiß, gilt der Standardwert nur für die Erstellung einer neuen Regel.

Wenn nicht null festgelegt ist, können Sie keinen Nullwert in das Feld einfügen, da dies einen Fehler verursacht.

Betrachten Sie es als einen ausfallsicheren Mechanismus, um Nullen zu verhindern.

1

My SQL Lehrer sagte, dass, wenn Sie sowohl einen DEFAULT Wert angeben und NOT NULL oder NULL, DEFAULT sollte immer vor NOT NULL oder NULL ausgedrückt werden.

So:

ALTER TABLE tbl ADD COLUMN col VARCHAR(20) DEFAULT "MyDefault" NOT NULL

ALTER TABLE tbl ADD COLUMN col VARCHAR(20) DEFAULT "MyDefault" NULL

+1

Hey, und danke für die Teilnahme. Dies geht jedoch nicht auf die vorliegende Frage ein, und beide Anordnungen sind vollständig wirksam. Ich finde es einfacher, den Standard am Ende zu setzen, wenn ich Tabellen manuell scripte, weil dann die Werte NULL und NOT NULL besser ausgerichtet sind. – emragins

+0

Okay, ich denke du hast auch Recht. Ich verstehe nicht, warum mein Kurs explizit sagt, was ich auf meine Antwort geschrieben habe. Ich weiß, dass meine Antwort die Frage nicht wirklich anspricht, aber ich fand, dass ein Kommentar nicht sehr lesbar wäre. –

+0

Es gibt einen Unterschied zwischen (subjektiven) Best Practices und Regeln. Es ist keine schlechte Idee, einen konsistenten Stil zu haben, aber in diesem speziellen Fall würde ich persönlich NOT NULL vor DEFAULT bevorzugen. Egal, Sie können auch Kommentare statt Antworten schreiben, das wäre passender gewesen. – makrom