Ändern einer Spalte: null auf nicht null

1217

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

Ich suche nach der spezifischen SQL-Syntax , um eine Spalte ColumnAin " not null" zu ändern . Angenommen, die Daten wurden so aktualisiert, dass sie keine Nullen enthalten.

Verwenden von SQL Server 2000 .

Karmischer Codierer
quelle
16
Eine andere Sache - Sie möchten möglicherweise eine Standardeinstellung hinzufügen, damit alle vorhandenen Einfügungen, die die Spalte nicht angeben, nicht fehlschlagen: ALTER TABLE FOO ADD CONSTRAINT FOO_Bar_Default STANDARD 0 FÜR Bar
Marc Gravell
4
Es kann Sie auch überraschen, dass das Ändern einer Spalte unter bestimmten UmständenNOT NULL viel Protokollierung verursachen kann.
Martin Smith

Antworten:

2012

Lassen Sie zunächst alle aktuellen NULLWerte verschwinden:

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

Aktualisieren Sie dann die Tabellendefinition, um "NULL" nicht zuzulassen:

ALTER TABLE [Table] ALTER COLUMN [Column] INTEGER NOT NULL
mdb
quelle
49
Lassen Sie mich einen Mehrwert für die beiden oben genannten richtigen Antworten schaffen. Die Semantik von NULL kann einige Bedeutungen haben. Eine der häufigsten Bedeutungen ist UNBEKANNT. Nehmen Sie als Beispiel SCORE. Ein Null-SCORE und ein ZERO-SCORE sind eine Welt voller Unterschiede! Bevor Sie die obigen Empfehlungen gemacht haben. Stellen Sie sicher, dass Ihre Anwendung in ihrer Geschäftslogik nicht null annimmt.
TechTravelThink
242
Sichern Sie zuerst Ihre Datenbank, falls Sie einen Tippfehler machen und Ihre Datenbank explodiert.
Mpen
20
Es ist seltsam, dass das MS SQL Management Studio diese Option nicht zulässt. Es prahlt mit "Tabelle löschen ..."
Sebastian
14
Datenbanken sollten immer gesichert werden. Sie wissen nie, wann einer Ihrer Mitarbeiter eine UPDATE- oder DELETE-Anweisung schreiben und die WHERE-Klausel vergessen könnte.
Vivian River
2
@SebastianGodelet: Es gibt eine Einstellung, mit der Sie diese Warnung deaktivieren oder so vornehmen können, dass Sie die Tabelle nicht ändern können. In einigen Fällen muss zum Ändern des Schemas einer Tabelle eine neue Tabelle erstellt, die Daten aus der alten kopiert und die alte Tabelle gelöscht werden. Da ein Fehler in diesem Prozess zu Datenverlust führen kann, warnt SSMS Sie und verhindert dies standardmäßig.
Siride
57

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

ALTER TABLE [Table] ADD CONSTRAINT [Constraint] DEFAULT 0 FOR [Column];
Greg Dougherty
quelle
Dies beantwortet das Problem nicht. Die Standardeinstellung ist bereits festgelegt. Es ist NOT NULL, das geändert werden muss. Mit nur Ihrer Antwort bleiben alle vorhandenen Datensätze NULL und das Problem bleibt bestehen.
PandaWood
6
Haben Sie den Teil über "Hinzufügen einer weiteren Zeile" gelesen? Wie in, ist dies zusätzlich zu der obigen Antwort?
Greg Dougherty
7
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, muss sich der Wortlaut wirklich ändern und Sie sollten es tun
Fügen
2
Ich wollte mich nur einschalten und sagen, dass es eine gute Idee ist, Ihre Einschränkungen explizit zu benennen, einschließlich der Standardeinstellungen. Wenn Sie jemals eine Spalte löschen müssen, müssen Sie den Namen der zu löschenden Einschränkung kennen, bevor Sie dazu in der Lage sind. Dies ist in unseren DB-Migrationen einige Male aufgetreten. Ich weiß, dass das Beispiel es hier enthält, aber es ist immer noch ein Ort, an dem einige Entwickler stolpern, weil der Name nicht erforderlich ist.
Jocull
38

Sie müssen dies in zwei Schritten tun:

  1. Aktualisieren Sie die Tabelle so, dass die Spalte keine Nullen enthält.
UPDATE MyTable SET MyNullableColumn = 0
WHERE MyNullableColumn IS NULL
  1. Ändern Sie die Tabelle, um die Eigenschaft der Spalte zu ändern
ALTER TABLE MyTable
ALTER COLUMN MyNullableColumn MyNullableColumnDatatype NOT NULL
Ralph Wiggum
quelle
27

Für Oracle 11g konnte ich das Spaltenattribut wie folgt ändern:

ALTER TABLE tablename MODIFY columnname datatype NOT NULL;

Ansonsten schien Abatichevs Antwort gut zu sein. Sie können die Änderung nicht wiederholen - sie beschwert sich (zumindest in SQL Developer), dass die Spalte bereits nicht null ist.

JDM
quelle
Es scheint, dass Sie in Oracle 11 das nicht wiederholen müssen datatype. Nur columname NOT NULList genug. Siehe die Dokumentation .
jpmc26
18

das hat bei mir funktioniert:

ALTER TABLE [Table] 
Alter COLUMN [Column] VARCHAR(50) not null;
Dheeraj Sam
quelle
16

Solange die Spalte keine eindeutige Kennung ist

UPDATE table set columnName = 0 where columnName is null

Dann

Ändern Sie die Tabelle, setzen Sie das Feld auf ungleich Null und geben Sie den Standardwert 0 an

Eppz
quelle
4

Dies scheint einfacher zu sein, funktioniert aber nur unter Oracle:

ALTER TABLE [Table] 
ALTER [Column] NUMBER DEFAULT 0 NOT NULL;

Darüber hinaus können Sie damit auch Spalten hinzufügen und nicht nur ändern. In diesem Beispiel wird der Standardwert (0) aktualisiert, wenn der Wert null war.

csomakk
quelle
Ja, aber Google leitet die Leute hierher. Es hat viele Upvotes erhalten, die es verursachen, und viele Downwotes. Ich denke es ist nützlich. Jeder kann dies ignorieren, aber ich denke ehrlich und sehe, dass dies den Menschen hilft.
Csomakk
Bitte lesen Sie die SO-Regeln. Wie schreibe ich eine gute Antwort? , TECHNISCHE FRAGEN HILFREICH BEANTWORTEN und die perfekte Frage schreiben . Anmerkungen: Haben Sie keine Angst, nutzlose Antworten zu löschen (oder stark zu bearbeiten) und antworten Sie nicht und führen Sie
Kiquenet
4

Im Fall von FOREIGN KEY CONSTRAINT... tritt ein Problem auf, wenn '0' in der Spalte der Primärschlüsseltabelle nicht vorhanden ist. Die Lösung dafür ist ...

SCHRITT 1:

Deaktivieren Sie alle Einschränkungen mit diesem Code:

EXEC sp_msforeachtable "ALTER TABLE ? NOCHECK CONSTRAINT all"

SCHRITT 2:

RUN UPDATE COMMAND (as mentioned in above comments)
RUN ALTER COMMAND (as mentioned in above comments)

SCHRITT 3:

Aktivieren Sie alle Einschränkungen mit diesem Code:

exec sp_msforeachtable @command1="print '?'", @command2="ALTER TABLE ? WITH CHECK CHECK CONSTRAINT all"
sam05
quelle
4

In meinem Fall hatte ich Schwierigkeiten mit den geposteten Antworten. Am Ende habe ich Folgendes verwendet:

ALTER TABLE table_name CHANGE COLUMN column_name column_name VARCHAR(200) NOT NULL DEFAULT '';

Wechseln Sie VARCHAR(200)zu Ihrem Datentyp und ändern Sie optional den Standardwert.

Wenn Sie keinen Standardwert haben, tritt bei dieser Änderung ein Problem auf, da der Standardwert null ist und einen Konflikt verursacht.

Philip Kirkbride
quelle
1

Nehmen wir ein Beispiel:

TABLE NAME=EMPLOYEE

Und ich möchte die Spalte EMPLOYEE_NAMEin ändern NOT NULL. Diese Abfrage kann für die Aufgabe verwendet werden:

ALTER TABLE EMPLOYEE MODIFY EMPLOYEE.EMPLOYEE_NAME datatype NOT NULL;
Ashish Dwivedi
quelle
Bitte schreien Sie nicht und verwenden Sie stattdessen die Formatierung, um Ihre Beiträge besser lesbar zu machen. ZB Hilfe beim Erkennen des Codeteils. stackoverflow.com/editing-help
Yunnosch
Bitte schreiben Sie auch keinen längeren Text in Großbuchstaben. Es wird als Schreien im Internet betrachtet
Zoe
1
@PawanTiwari Bitte nehmen Sie die vollständigen Änderungen vor. Sie schienen nicht alle Probleme des Beitrags zu beheben. Das meiste davon wird aktiviert.
Doppel-Piepton
@ Doppel-Piepton, Klar, das werde ich mir merken. Vielen Dank
Pawan Tiwari
Abgesehen von den Formatierungsproblemen machen Sie bitte deutlicher, welche zusätzlichen Erkenntnisse Ihre Antwort bietet, im Vergleich zu den älteren Antworten von Ralph Wiggum, JDM, Rashmi Singh und trooper31, die auf den ersten Blick funktional identisch erscheinen. Es erscheint daher notwendig, auf die Feinheiten Ihrer Lösung hinzuweisen. Versuchen Sie, den Eindruck zu vermeiden, nur Antworten zu kopieren ...
Yunnosch
0

Für die eingebaute JavaDB, die im JDK (von Oracle unterstützte Distribution des Apache Derby) enthalten ist, hat das Folgende für mich funktioniert

alter table [table name] alter column [column name] not null;
trooper31
quelle
0

Die Spalte nicht null zu machen und Standard hinzuzufügen, kann auch in der SSMS-GUI erfolgen.

  1. Wie andere bereits angegeben haben, können Sie "nicht null" erst setzen, wenn alle vorhandenen Daten wie folgt "nicht null" sind:

UPDATE myTable SET myColumn = 0

  1. Sobald dies erledigt ist, können Sie mit der Tabelle in der Entwurfsansicht (klicken Sie mit der rechten Maustaste auf die Tabelle und klicken Sie auf "Entwurfsansicht") die Spalten "Nullen zulassen" wie folgt deaktivieren :

Geben Sie hier die Bildbeschreibung ein

  1. Noch in der Entwurfsansicht mit der Spalte ausgewählt hat , können Sie die sehen Spalteneigenschaften im Fenster unten und setzen den Standard auf 0 in dort auch etwa so:

Geben Sie hier die Bildbeschreibung ein

Tony L.
quelle
Ich sehe die Ablehnung, kann aber ohne Feedback nichts korrigieren. Bitte lassen Sie mich wissen, wenn etwas nicht funktioniert hat.
Tony L.
-1

Sie können die Definition der vorhandenen DB-Spalte mithilfe der folgenden SQL ändern.

ALTER TABLE mytable modify mycolumn datatype NOT NULL;
Rashmi singh
quelle