Fügen Sie eine NOT NULL-Spalte in eine vorhandene Tabelle ein


121

Ich habe versucht:

ALTER TABLE MY_TABLE 
ADD STAGE INT NOT NULL;

Aber es gibt diese Fehlermeldung:

Mit ALTER TABLE können nur Spalten hinzugefügt werden, die Nullen enthalten können oder für die eine DEFAULT-Definition angegeben ist

Antworten:


221

Optional können Sie zunächst eine Null-fähige Spalte erstellen und dann Ihre Tabellenspalte mit gültigen Nicht-Null-Werten und schließlich die ALTER-Spalte aktualisieren, um die NOT NULL-Einschränkung festzulegen:

ALTER TABLE MY_TABLE ADD STAGE INT NULL
GO
UPDATE MY_TABLE SET <a valid not null values for your column>
GO
ALTER TABLE MY_TABLE ALTER COLUMN STAGE INT NOT NULL
GO

Eine andere Option besteht darin, den korrekten Standardwert für Ihre Spalte anzugeben:

ALTER TABLE MY_TABLE ADD STAGE INT NOT NULL DEFAULT '0'

UPD: Bitte beachten Sie, dass die obige Antwort Folgendes enthält, GOwas ein Muss ist, wenn Sie diesen Code auf einem Microsoft SQL Server ausführen. Wenn Sie dieselbe Operation unter Oracle oder MySQL ausführen möchten, müssen Sie das folgende Semikolon verwenden ;:

ALTER TABLE MY_TABLE ADD STAGE INT NULL;
UPDATE MY_TABLE SET <a valid not null values for your column>;
ALTER TABLE MY_TABLE ALTER COLUMN STAGE INT NOT NULL;

1
Ich persönlich bevorzuge hier den ersten Weg, wenn Sie Werte haben, die Sie manuell in das Feld eingeben können. Auf diese Weise müssen Sie sich nicht um das Erstellen und Löschen einer Standardeinschränkung kümmern, wenn Sie keine benötigen.
Mark W Dickson

1
@acarlon - ich denke das reicht. Die gefährliche updateAussage, die Sie erwähnen, würde sich bei jeder Abfrage nachteilig auswirken. Es sollte einfach genug sein, um festzustellen, ob die updateAnweisung hier eine zusätzliche Spalte enthält . Im Allgemeinen fügen Sie jeweils nur eine oder zwei Spalten hinzu. Wenn Sie Ihrer updateAnweisung in diesem Beispiel eine zusätzliche Spalte hinzufügen , die nicht dorthin gehört, sollten Sie möglicherweise nicht in erster Linie für die Daten verantwortlich sein.
Mark W Dickson

1
ANDROID Entwickler, die SQLite verwenden, beachten, dass ALTER COLUMNdies in SQLite NICHT unterstützt wird.
Sdghasemi

2
Ich habe es noch nie gesehen GOund es scheint nicht Teil der SQL-Spezifikation zu sein . Daher wird es wahrscheinlich zu Fehlern bei Skripten führen, die nicht von einem der Tools ausgeführt werden, die es unterstützen. Verwenden Sie einfach Semikolons? Ich empfehle nicht, Microsoft-Standards zu verbreiten, da sie sich selten um einen etablierten und vernünftigen Standard kümmern, sondern ihre eigenen erfinden, nur um ihre eigenen erfinden zu lassen. Ansonsten hilfreiche Antwort.
Neonit

2
@Neon danke für den Kommentar, aber die ursprüngliche Frage betraf MS SQL Server, deshalb ist GO da. Aber ich werde meiner Antwort einen Hinweis hinzufügen.
Pavel Morshenyuk

13

Wenn Sie nicht zulassen, dass die Spalte Null ist, müssen Sie einen Standardwert zum Auffüllen vorhandener Zeilen angeben. z.B

ALTER TABLE dbo.YourTbl ADD
    newcol int NOT NULL CONSTRAINT DF_YourTbl_newcol DEFAULT 0

In der Enterprise Edition ist dies eine Änderung der Metadaten seit 2012


2
Sie müssen nicht müssen , aber es ist eine Option.
Matt

6

Die Fehlermeldung ist sehr beschreibend. Versuchen Sie:

ALTER TABLE MyTable ADD Stage INT NOT NULL DEFAULT '-';

und was bedeutet das "Minus" im Standardteil?
Mladen B.

3

Andere SQL-Implementierungen unterliegen ähnlichen Einschränkungen. Der Grund dafür ist, dass für das Hinzufügen einer Spalte das Hinzufügen von Werten für diese Spalte erforderlich ist (logisch, auch wenn nicht physisch) NULL. Wenn Sie nicht zulassen NULLund keine haben default, wie hoch wird der Wert sein?

Da SQL Server unterstützt ADD CONSTRAINT, würde ich Pavel empfehlen, eine nullfähige Spalte zu erstellen und dann eine NOT NULLEinschränkung hinzuzufügen , nachdem Sie sie mit Nichtwerten gefüllt NULLhaben.


MySQL unterstützt das Hinzufügen von Nicht-Null-Spalten zu vorhandenen Tabellen mit Daten, wobei der "sinnvolle" leere Wert für den Datentyp in die vorhandenen Zeilen eingegeben wird (dh 0,0 für float, 0 für Ganzzahl, leere Zeichenfolge für Zeichenfolge usw.).
Michael Tsang

2

Dies hat bei mir funktioniert, kann auch aus der Entwurfsansicht "ausgeliehen" werden, Änderungen vornehmen -> Rechtsklick -> Änderungsskript generieren.

BEGIN TRANSACTION
GO
ALTER TABLE dbo.YOURTABLE ADD
    YOURCOLUMN bit NOT NULL CONSTRAINT DF_YOURTABLE_YOURCOLUMN DEFAULT 0
GO
COMMIT

1
ALTER TABLE `MY_TABLE` ADD COLUMN `STAGE` INTEGER UNSIGNED NOT NULL AFTER `PREV_COLUMN`;

0
Alter TABLE 'TARGET' add 'ShouldAddColumn' Integer Not Null default "0"

1
Was trägt diese Antwort zu diesem Thema bei?
Barbansan
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.