Wie kann ich eine Spalte mit einem Standardwert zu einer bestehenden Tabelle in SQL-Server 2000 / SQL Server 2005 ?
Antworten
Zu viele Anzeigen?Hier gibt es viele Antworten, aber ich habe das Bedürfnis, diese erweiterte Methode hinzuzufügen. Sie scheint viel länger zu sein, ist aber äußerst nützlich, wenn Sie ein NOT NULL-Feld zu einer Tabelle mit Millionen von Zeilen in einer aktiven Datenbank hinzufügen wollen.
ALTER TABLE {schemaName}.{tableName}
ADD {columnName} {datatype} NULL
CONSTRAINT {constraintName} DEFAULT {DefaultValue}
UPDATE {schemaName}.{tableName}
SET {columnName} = {DefaultValue}
WHERE {columName} IS NULL
ALTER TABLE {schemaName}.{tableName}
ALTER COLUMN {columnName} {datatype} NOT NULL
Dadurch wird die Spalte als löschbares Feld und mit dem Standardwert hinzugefügt, alle Felder werden auf den Standardwert aktualisiert (oder Sie können aussagekräftigere Werte zuweisen), und schließlich wird die Spalte in NOT NULL geändert.
Der Grund dafür ist, wenn Sie eine große Tabelle aktualisieren und ein neues Nicht-Null-Feld hinzufügen, muss in jede einzelne Zeile geschrieben werden und dadurch wird die gesamte Tabelle gesperrt, da die Spalte hinzugefügt und dann alle Werte geschrieben werden.
Diese Methode fügt die löschbare Spalte hinzu, die von sich aus viel schneller arbeitet, und füllt dann die Daten, bevor der Nicht-Null-Status gesetzt wird.
Ich habe festgestellt, dass die Durchführung des gesamten Vorgangs in einer einzigen Anweisung eine unserer aktiveren Tabellen für 4-8 Minuten sperrt, und oft habe ich den Prozess abgebrochen. Bei dieser Methode dauert jeder Teil normalerweise nur ein paar Sekunden und verursacht nur minimale Sperren.
Wenn Sie eine Tabelle mit Milliarden von Zeilen haben, kann es sich außerdem lohnen, die Aktualisierung wie folgt zu stapeln:
WHILE 1=1
BEGIN
UPDATE TOP (1000000) {schemaName}.{tableName}
SET {columnName} = {DefaultValue}
WHERE {columName} IS NULL
IF @@ROWCOUNT < 1000000
BREAK;
END
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.