Kann ich eine Nicht-Null-Spalte ohne DEFAULT-Wert hinzufügen?

72

Kann ich eine Spalte hinzufügen, die ich als NICHT NULL spezifiziere? Ich möchte den DEFAULT-Wert nicht angeben, aber MS-SQL 2005 sagt:

Mit ALTER TABLE können nur Spalten hinzugefügt werden, die Nullen enthalten können oder für die eine DEFAULT-Definition angegeben ist, oder die hinzugefügte Spalte ist eine Identitäts- oder Zeitstempelspalte. Wenn keine der vorherigen Bedingungen erfüllt ist, muss die Tabelle leer sein, um das Hinzufügen zu ermöglichen dieser Spalte. Die Spalte 'test' kann nicht zur nicht leeren Tabelle 'shiplist' hinzugefügt werden, da sie diese Bedingungen nicht erfüllt.

Wenn JA, teilen Sie mir bitte die Syntax mit. Wenn Nein, geben Sie bitte den Grund an.

Saubhagya
quelle
Ich denke, der Punkt dabei ist, dass die Spalte als 'NOT NULL' hinzugefügt werden kann, aber geben Sie an, wie der Wert für die vorhandenen Spalten sein soll, und Sie müssen nichts Süßes tun, wie eine Einschränkung zu erstellen und sie dann zu löschen. Scheint mir vernünftig zu sein, NICHT NULL, keine Standardeinstellung zu haben, sondern nur anzugeben, wie der Wert für vorhandene Zeilen sein soll.
Bunggo

Antworten:

96

Nein, das kannst du nicht.

Denn wenn Sie könnten, würde SQL nicht wissen, was als Wert in die bereits vorhandenen Datensätze eingefügt werden soll. Wenn Sie keine Datensätze in der Tabelle hätten, würde dies ohne Probleme funktionieren.

Der einfachste Weg, dies zu tun, besteht darin, die Spalte mit einem Standard zu erstellen und dann den Standard zu entfernen.

ALTER TABLE dbo.MyTable ADD
MyColumn text NOT NULL CONSTRAINT DF_MyTable_MyColumn DEFAULT 'defaultValue'
ALTER TABLE dbo.MyTable
DROP CONSTRAINT DF_MyTable_MyColumn

Eine andere Alternative wäre, die Spalte ohne Einschränkung hinzuzufügen, die Werte für alle Zellen zu füllen und die Einschränkung hinzuzufügen.

Gimly
quelle
20

Fügen Sie die Spalte zur Tabelle hinzu, aktualisieren Sie die vorhandenen Zeilen, sodass keine von ihnen null ist, und fügen Sie dann eine Einschränkung "nicht null" hinzu.

Paul Tomblin
quelle
4
Dies ist eine bessere Lösung als das Erstellen / Löschen der Standardeinstellung, wenn die Logik für die neuen Werte komplexer als eine einfache Konstante ist.
Damien_The_Unbeliever
2
Warum oder wie ist es möglicherweise besser, (manuell?) Zu aktualisieren + auf "nicht null" zu ändern, anstatt automatisch durch Standard zu "aktualisieren" + auf "kein Standard" zu wechseln (Standard
löschen
@ vgv8 - Was ist, wenn die neuen Werte in jeder Zeile von anderen Spalten abhängen, die sich bereits in der Zeile befinden? Sie können dies nicht über eine Standardeinschränkung ausdrücken.
Damien_The_Unbeliever
@Damien_The_Unbeliever, siehe meine Antwort stackoverflow.com/questions/3997966/… . Ich musste eine Variante meiner Antwort
angeben
8

Nein - SQL Server lehnt dies vernünftigerweise ab, da es nicht weiß, welchen Wert vorhandene Zeilen haben sollten

Es ist einfach, gleichzeitig ein DEFAULT zu erstellen und es dann sofort zu löschen.

Damien_The_Unbeliever
quelle
3

Ich benutze diesen Ansatz, um die Spalte NOT NULL ohne Standardwert einzufügen

ALTER TABLE [Table] ADD [Column] INT NULL
GO
UPDATE [Table] SET [Column] = <default_value>
ALTER TABLE [Table] ALTER COLUMN [Column] INT NOT NULL
sad_robot
quelle
1

Nein, du kannst nicht. Sie können jedoch den Standardwert ('') angeben.

chris
quelle
0

Nein.

Verwenden Sie einfach eine leere Zeichenfolge ''(im Fall eines Zeichentyps) oder 0 (falls numerisch) usw. als DEFAULT-Wert

abatishchev
quelle
0

Nein, Sie können nicht, da SQL Server oder andere Datenbankmodule diese neue Spalte für vorhandene Zeilen in Ihrer Datentabelle auf Null setzen. Da Sie jedoch kein NULL zulassen, müssen Sie einen Standardwert angeben, um Ihre eigene Einschränkung zu berücksichtigen. Das fällt unter großen Sinn! Die DBE extrapoliert keinen Wert für Nicht-Null-Werte für die vorhandenen Zeilen.

Will Marcouiller
quelle
Während das, was Sie sagen, sinnvoll ist, trifft es nicht zu, dass mindestens ein "Datenbankmodul" MS Access ist, mit dem eine NOT NULLSpalte zu einer Tabelle hinzugefügt werden kann, ohne auch a anzugeben DEFAULT, dessen Ergebnis Nullwerte in einer NOT NULLSpalte sind. Ich werde Beweise als Antwort liefern ...
Tages, wenn
0

@ Damien_The_Unbelievers Kommentar : Fügt er eine berechnete Spalte hinzu? Weder Frage noch Antwort implizierten so etwas. Im Fall einer berechneten Spalte lautet der Fehler:

"Für berechnete Spalten können nur UNIQUE- oder PRIMARY KEY-Einschränkungen erstellt werden, während für CHECK-, FOREIGN KEY- und NOT NULL-Einschränkungen die Beibehaltung berechneter Spalten erforderlich ist."

OK, wenn Sie dieses Ratespiel fortsetzen möchten, sehen Sie hier mein Skript, das das Hinzufügen der Spalte "NOT NULL" in einem Schritt "ALTER TABLE" veranschaulicht:

CREATE TABLE TestInsertComputedColumn 
(
    FirstName VARCHAR(100),
    LastName CHAR(50)
);  

insert into TestInsertComputedColumn(FirstName,LastName)
     select 'v', 'gv8';
select * from TestInsertComputedColumn;

ALTER TABLE TestInsertComputedColumn 
      ADD FullName As FirstName + LastName PERSISTED NOT NULL;

select * from TestInsertComputedColumn;
--drop TABLE TestInsertComputedColumn;
Gennady Vanin Геннадий Ванин
quelle
0

Ich habe unten Ansatz verwendet, es hat bei mir funktioniert

Syntax:
ALTER TABLE <YourTable> ADD <NewColumn> <NewColumnType> NOT NULL DEFAULT <DefaultValue>

Example:
ALTER TABLE Tablename ADD ColumnName datetime NOT NULL DEFAULT GETDATE();
Joee
quelle
0

Optional können Sie zunächst eine Null-fähige Spalte erstellen, dann Ihre Tabellenspalte mit gültigen Nicht-Null-Werten aktualisieren und schließlich die ALTER-Spalte, 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
Yonatan Nir
quelle