Ändern Sie eine Nullable-Spalte mit dem Standardwert in NOT NULL

74

Ich bin heute auf eine alte Tabelle mit einer datetime-Spalte namens 'Created' gestoßen, die Nullen zulässt. Jetzt möchte ich dies so ändern, dass es NICHT NULL ist, und auch eine Einschränkung zum Hinzufügen eines Standardwerts (getdate ()) einschließen.

Bisher habe ich das folgende Skript, das gut funktioniert, vorausgesetzt, ich habe alle Nullen vorher bereinigt:

ALTER TABLE dbo.MyTable ALTER COLUMN Created DATETIME NOT NULL 

Gibt es eine Möglichkeit, den Standardwert auch in der ALTER-Anweisung anzugeben?

Jim B.
quelle
Möchten Sie alle bereits vorhandenen Datensätze mit dem heutigen Datum füllen?
Froadie
Ja; das würde ausreichen.
Jim B

Antworten:

94

Ich denke, Sie müssen dies als drei separate Aussagen tun. Ich habe mich umgesehen und alles, was ich gesehen habe, scheint darauf hinzudeuten, dass Sie es tun können, wenn Sie eine Spalte hinzufügen , aber nicht, wenn Sie eine ändern.

ALTER TABLE dbo.MyTable
ADD CONSTRAINT my_Con DEFAULT GETDATE() for created

UPDATE MyTable SET Created = GetDate() where Created IS NULL

ALTER TABLE dbo.MyTable 
ALTER COLUMN Created DATETIME NOT NULL 
Abe Miessler
quelle
14
Hat das noch jemand versucht ? Ich habe festgestellt, dass die zweite Anweisung aufgrund eines Nullwerts in der Tabelle fehlschlägt (trotz des Vorhandenseins eines Standardwerts). Sie müssen einen Schritt zwischen diesen beiden einfügen, in dem Sie die vorhandenen Nullen bereinigen.
Jeremy Stein
3
Es sieht so aus, als hätte jemand die Antwort bearbeitet. Es ist jetzt korrekt und vollständig.
Jenny O'Reilly
Warum müssen wir dort Einschränkungen hinzufügen?
Akmal Salikhov
11

Möglicherweise müssen Sie zuerst alle Datensätze, die null sind, auf den Standardwert aktualisieren und dann die Anweisung alter table verwenden.

Update dbo.TableName
Set
Created="01/01/2000"
where Created is NULL
Gage
quelle
4

Sie müssen zwei Abfragen ausführen:

Eins - um den Standardwert zur erforderlichen Spalte hinzuzufügen

ALTER TABLE 'Table_Name` ADD DEFAULT' value 'FOR' Column_Name '

Ich möchte der Spalte IsDeleted den folgenden Standardwert hinzufügen:

Beispiel: ALTER TABLE [dbo]. [Employees] ADD Default 0 für IsDeleted

Zwei - um den Spaltenwert nullable auf nicht null zu ändern

ALTER TABLE 'Tabellenname' ALTER COLUMN 'Spaltenname' 'Datentyp' NICHT NULL

Ich möchte die Spalte IsDeleted als nicht null machen

ALTER TABLE [dbo]. [Employees] Spalte ändern IsDeleted BIT NOT NULL

Jinna Balu
quelle
Scheint nicht mit SQL Server zu funktionieren: Die bereits in der Tabelle enthaltenen Nullwerte sind nicht betroffen.
user2864740
2

Wenn es sich um SQL Server handelt, können Sie dies für die Spalteneigenschaften in der Entwurfsansicht tun

Versuche dies?:

ALTER TABLE dbo.TableName 
  ADD CONSTRAINT DF_TableName_ColumnName
    DEFAULT '01/01/2000' FOR ColumnName
BenW
quelle
Dies muss in Skriptform vorliegen, damit es als Teil unseres automatisierten Freigabeprozesses ausgeführt werden kann.
Jim B
Immer noch keine Würfel. Die Einschränkung wird hinzugefügt. aber es barfs immer noch, wenn es versucht, die NULL in NICHT NULL umzuwandeln
Jim B
Skript zum Aktualisieren aller Nullen, um den Wert auf Ihren Standardwert zu setzen, und ihn dann anwenden? Entschuldigung, es ist keine große Hilfe!
BenW
Ich habe die Anweisung zum Konvertieren von null in nicht null entfernt und die Lösung funktioniert. Da ein Standardwert definiert ist, erhalten alle meine neuen Einträge meinen festgelegten Standardwert, sodass ich anscheinend kein Risiko für Nullwerte habe. Stellen Sie einfach sicher, dass Ihr Code in Ihren Update-Anweisungen niemals einen Nullwert setzt.
ShadeTreeDeveloper
0

Versuche dies

ALTER TABLE Tabellenname ALTER COLUMN Spaltenname Datentyp NOT NULL;

Belal Ahmad
quelle