Wie kann ich eine Spalte mit einem Standardwert zu einer bestehenden Tabelle in SQL-Server 2000 / SQL Server 2005 ?
Antworten
Zu viele Anzeigen?Es gibt 2 verschiedene Möglichkeiten, dieses Problem zu lösen. Beide fügen einen Standardwert hinzu, geben der Problemstellung aber eine völlig andere Bedeutung.
Beginnen wir mit der Erstellung einiger Beispieldaten.
Beispieldaten erstellen
CREATE TABLE ExistingTable (ID INT)
GO
INSERT INTO ExistingTable (ID)
VALUES (1), (2), (3)
GO
SELECT *
FROM ExistingTable
1. spalten mit Standardwert für zukünftige Einfügungen hinzufügen
ALTER TABLE ExistingTable
ADD ColWithDefault VARCHAR(10) DEFAULT 'Hi'
GO
Da wir nun eine Standardspalte hinzugefügt haben, wird der Wert beim Einfügen eines neuen Datensatzes standardmäßig auf 'Hi'
wenn kein Wert angegeben wird
INSERT INTO ExistingTable(ID)
VALUES (4)
GO
Select * from ExistingTable
GO
Damit ist das Problem des Standardwerts gelöst, aber es gibt einen Haken an der Sache. Was, wenn wir den Standardwert in allen Spalten haben wollen, nicht nur in den zukünftigen Einfügungen? Hierfür gibt es Methode 2.
2. eine Spalte mit Standardwert für ALLE Einfügungen hinzufügen
ALTER TABLE ExistingTable
ADD DefaultColWithVal VARCHAR(10) DEFAULT 'DefaultAll'
WITH VALUES
GO
Select * from ExistingTable
GO
Das folgende Skript fügt eine neue Spalte mit einem Standardwert für jedes mögliche Szenario hinzu.
Ich hoffe, dass dies einen Mehrwert für die gestellte Frage darstellt. Danke!
Dies kann mit dem folgenden Code geschehen.
CREATE TABLE TestTable
(FirstCol INT NOT NULL)
GO
------------------------------
-- Option 1
------------------------------
-- Adding New Column
ALTER TABLE TestTable
ADD SecondCol INT
GO
-- Updating it with Default
UPDATE TestTable
SET SecondCol = 0
GO
-- Alter
ALTER TABLE TestTable
ALTER COLUMN SecondCol INT NOT NULL
GO
Nun, ich habe meine vorherige Antwort etwas abgeändert. Mir ist aufgefallen, dass in keiner der Antworten erwähnt wurde IF NOT EXISTS
. Ich werde also eine neue Lösung anbieten, da ich einige Probleme mit der Änderung der Tabelle hatte.
IF NOT EXISTS (SELECT * FROM INFORMATION_SCHEMA.columns WHERE table_name = 'TaskSheet' AND column_name = 'IsBilledToClient')
BEGIN
ALTER TABLE dbo.TaskSheet ADD
IsBilledToClient bit NOT NULL DEFAULT ((1))
END
GO
Hier TaskSheet
ist der Name der jeweiligen Tabelle und IsBilledToClient
ist die neue Spalte, die Sie einfügen wollen, und 1
den Standardwert. Das bedeutet, dass in der neuen Spalte der Wert der vorhandenen Zeilen stehen wird, also wird dort automatisch einer eingestellt. Sie können jedoch nach Belieben den Spaltentyp ändern, wie ich es getan habe BIT
also habe ich den Standardwert 1 eingegeben.
Ich schlage das obige System vor, weil ich ein Problem hatte. Worin besteht also das Problem? Das Problem ist, wenn die IsBilledToClient
Spalte in der Tabelle existiert, dann werden Sie, wenn Sie nur den unten angegebenen Teil des Codes ausführen, einen Fehler im SQL Server Query Builder sehen. Wenn die Spalte jedoch nicht vorhanden ist, tritt bei der ersten Ausführung kein Fehler auf.
ALTER TABLE {TABLENAME}
ADD {COLUMNNAME} {TYPE} {NULL|NOT NULL}
CONSTRAINT {CONSTRAINT_NAME} DEFAULT {DEFAULT_VALUE}
[WITH VALUES]
12 Stimmen
Warum gibt es auf diese Frage 41 Antworten? Wenn ich sie durchsehe, sagen die meisten das Gleiche. Warum werden diese nicht entfernt? Diese Frage braucht nur maximal 3 Antworten.
0 Stimmen
ALTER TABLE SomeTable ADD SomeCol Bit NULL --O NOT NULL. CONSTRAINT D_SomeTable_SomeCol --Wenn ausgelassen, wird ein Default-Constraint Name automatisch generiert. DEFAULT (0)--Optionale Standard-Beschränkung. WITH VALUES --Hinzufügen, wenn die Spalte nullbar ist und Sie den Standardwert für existierende Datensätze haben wollen.
1 Stimmen
@MichaelZ. - 43 Antworten jetzt .....
1 Stimmen
Meiner Meinung nach entspricht diese Frage nicht den Mindestanforderungen an den Aufwand und hätte daher gestrichen werden müssen. @MichaelZ.
1 Stimmen
@JavierG.Raya, aber Sie haben eine neue Antwort erstellt und Sie schließen MYSQL ein. Sie sind Teil des Problems mit dieser Seite. Sie sollten Ihre Antwort löschen.
0 Stimmen
@JavierG.Raya Die Syntax von MYSQL stimmt nicht immer mit der von MSSQL überein, so dass die Bereitstellung einer Antwort für MySQL die Leute eher verwirrt. Es gibt 44 Antworten hier. Warum dachten Sie, dass es Ihre braucht? Es braucht sie nicht.