1376 Stimmen

Ändern einer Spalte: null zu nicht null

Ich habe eine Tabelle, die mehrere nullbare Integer-Spalten hat. Dies ist aus mehreren Gründen unerwünscht, daher möchte ich alle Nullen auf 0 aktualisieren und dann diese Spalten auf NOT NULL . Abgesehen von der Änderung von Nullen in 0 müssen die Daten erhalten bleiben.

Ich suche die spezifische SQL-Syntax um eine Spalte zu ändern (nennen Sie es ColumnA ) zu " not null ". Angenommen, die Daten wurden so aktualisiert, dass sie keine Nullen enthalten.

Verwendung von SQL-Server 2000 .

19 Stimmen

Eine andere Sache - Sie könnten eine Voreinstellung hinzufügen, damit alle vorhandenen Einfügungen, die die Spalte nicht angeben, nicht fehlschlagen: ALTER TABLE FOO ADD CONSTRAINT FOO_Bar_Default DEFAULT 0 FOR Bar

5 Stimmen

Es mag Sie auch überraschen, dass unter bestimmten Umständen Ändern einer Spalte in NOT NULL kann eine Menge Protokollierung verursachen.

2218voto

mdb Punkte 50584

Machen Sie zunächst alle aktuellen NULL Werte verschwinden:

UPDATE [Table] SET [Column]=0 WHERE [Column] IS NULL

Aktualisieren Sie dann die Tabellendefinition, um "NULLs" zu verbieten:

ALTER TABLE [Table] ALTER COLUMN [Column] INTEGER NOT NULL

60 Stimmen

Lassen Sie mich zu den beiden obigen richtigen Antworten noch etwas hinzufügen. Die Semantik von NULL kann mehrere Bedeutungen haben. Eine der häufigsten Bedeutungen ist UNBEKANNT. Nehmen Sie SCORE als Beispiel. Ein SCORE von Null und ein SCORE von NULL sind ein himmelweiter Unterschied! Bevor Sie die obigen Empfehlungen befolgen. Vergewissern Sie sich, dass Ihre Anwendung in ihrer Geschäftslogik keine Nullen verwendet.

253 Stimmen

Sichern Sie zuerst Ihre Datenbank, falls Sie einen Tippfehler machen und Ihre DB explodiert.

16 Stimmen

Datenbanken sollten immer gesichert werden. Sie wissen nie, wann einer Ihrer Mitarbeiter eine UPDATE- oder DELETE-Anweisung schreibt und die WHERE-Klausel vergisst.

67voto

Greg Dougherty Punkte 3107

Ich hatte das gleiche Problem, aber das Feld war standardmäßig auf null gesetzt, und jetzt möchte ich es auf 0 setzen. Dazu musste ich eine weitere Zeile nach der Lösung von mdb hinzufügen:

ALTER TABLE [Table] ADD CONSTRAINT [Constraint] DEFAULT 0 FOR [Column];

0 Stimmen

Damit ist das Problem nicht gelöst. Der Standardwert ist bereits festgelegt, es ist das NOT NULL, das geändert werden muss. Nur mit Ihrer Antwort bleiben alle vorhandenen Datensätze NULL und das Problem bleibt bestehen.

7 Stimmen

Haben Sie den Teil über "eine weitere Zeile hinzufügen" gelesen? Das heißt, dies ist zusätzlich zu der obigen Antwort?

8 Stimmen

Nein, es ist nicht klar, dass "eine weitere Zeile hinzufügen" "zusätzlich zu der obigen Antwort" bedeutet (zumal es viele Antworten "oben" gibt) - wenn Sie das gemeint haben, dann muss die Formulierung wirklich geändert werden und Sie sollten die Zeile der Antwort, auf die Sie sich beziehen, mit angeben

41voto

Ralph Wiggum Punkte 689

Sie müssen dies in zwei Schritten tun:

  1. Aktualisieren Sie die Tabelle so, dass keine Nullen in der Spalte vorhanden sind.

    UPDATE MyTable SET MyNullableColumn = 0 WHERE MyNullableColumn IS NULL

  2. Ändern Sie die Tabelle, um die Eigenschaft der Spalte zu ändern

    ALTER TABLE MyTable ALTER COLUMN MyNullableColumn MyNullableColumnDatatype NOT NULL

0 Stimmen

SET MyNullableColumn = 0 funktioniert nur, wenn Ihre vorhandene Spalte eine numerische Spalte ist. Für nicht numerische Typen müssen Sie einen anderen Standardwert wie eine leere Zeichenkette oder ein Standarddatum usw. festlegen. Aber diese Antwort ist für die oben gestellte Frage durchaus relevant und richtig ;-)

31voto

JDM Punkte 339

Bei Oracle 11g konnte ich das Spaltenattribut wie folgt ändern:

ALTER TABLE tablename MODIFY columnname datatype NOT NULL;

Ansonsten schien die Antwort von abatichev gut zu sein. Sie können das alter nicht wiederholen - es beschwert sich (zumindest in SQL Developer), dass die Spalte bereits nicht null ist.

0 Stimmen

Es scheint, dass Sie in Oracle 11 nicht mehr die datatype . Lediglich columname NOT NULL ist ausreichend. Siehe die Dokumentation .

22voto

Dheeraj Sam Punkte 349

Das hat bei mir funktioniert:

ALTER TABLE [Table] 
Alter COLUMN [Column] VARCHAR(50) not null;

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X