wake-up-neo.com

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

Kann ich eine Spalte hinzufügen, die als NOT NULL angegeben wird, ich möchte nicht den DEFAULT-Wert angeben, aber MS-SQL 2005 sagt:

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

Falls ja, lassen Sie mich bitte die Syntax wissen, falls nein, geben Sie bitte den Grund an.

56
Saubhagya

Nein, das kannst du nicht. 

Denn wenn Sie könnten, würde SQL nicht wissen, welchen Wert es in den bereits vorhandenen Datensätzen haben soll. Wenn Sie keine Datensätze in der Tabelle haben, funktioniert das ohne Probleme. 

Am einfachsten ist es, die Spalte mit einem Standardwert zu erstellen und den Standardwert 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 weitere Alternative wäre, die Spalte ohne Einschränkung hinzuzufügen, die Werte für alle Zellen aufzufüllen und die Einschränkung hinzuzufügen.

75
Gimly

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

19
Paul Tomblin

Nein - SQL Server lehnt dies vernünftigerweise ab, weil es nicht wissen würde, welchen Wert vorhandene Zeilen haben sollten

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

Ich benutze diesen Ansatz, um eine NOT NULL-Spalte 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
2
sad_robot

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

1
chris

Nein.

Verwenden Sie einfach den leeren String '' (bei Zeichentyp) oder 0 (falls numerisch) usw. als DEFAULT-Wert

0
abatishchev

@ Damien_The_Unbelievers Kommentar , Fügt es eine berechnete Spalte hinzu? Weder die Frage noch die Antwort implizierten so etwas. Im Falle 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 Berechnung der berechneten Spalten erforderlich ist." 

Wenn Sie dieses Ratespiel fortsetzen möchten, wird hier das Skript erläutert, in dem die Spalte "NOT NULL" in einem Schritt "ALTER TABLE" hinzugefügt wird: 

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;

Nein, das ist nicht möglich. SQL Server oder andere Datenbankmodule erzwingen, dass diese neue Spalte für vorhandene Zeilen in Ihrer Datentabelle null ist. Da Sie jedoch keine NULL zulassen, müssen Sie einen Standardwert angeben, um Ihre eigene Einschränkung zu berücksichtigen. Das liegt in einem guten Sinn! Die DBE extrapoliert keinen Wert für Nicht-Null-Werte für die vorhandenen Zeilen.

0