Tabelle ändern: So ändern Sie das Attribut 'Nullen zulassen' von nicht null, um null zuzulassen

207

Wie ändere ich ein Attribut in einer Tabelle mit T-SQL, um Nullen zuzulassen (nicht null -> null)? Tisch vielleicht ändern?

CrazyMouse
quelle
12
SQL Server Management Studio erstellt ein sehr komplexes Skript für eine so einfache Aufgabe. Deshalb war ich verwirrt und überprüfte den Stapelüberlauf. Vielleicht ist das der Punkt der Frage ...
Tillito

Antworten:

363
-- replace NVARCHAR(42) with the actual type of your column
ALTER TABLE your_table
ALTER COLUMN your_column NVARCHAR(42) NULL
LukeH
quelle
4
Oder genauso ALTER TABLE your_table ALTER COLUMN your_column NVARCHAR(42)wie es standardmäßig sowieso Nullen zulässt, wenn nicht ausdrücklich anders angegeben.
Martin Smith
3
Beachten Sie, wenn Sie mehrere Spalten ändern müssen, um Null zuzulassen, müssen Sie separate ALTER TABLE .. ALTER COLUMN ..Befehle ausführen
sonyisda1
2
Beachten Sie, dass es einige Fälle gibt, in denen dies möglicherweise nicht funktioniert - siehe diese Antwort von DBA Stack Exchange, wenn Sie eine erhaltenALTER TABLE ALTER COLUMN failed because one or more objects access this column.
Jarrod Dixon
49

Ja, Sie können ALTER TABLEFolgendes verwenden:

ALTER TABLE [table name] ALTER COLUMN [column name] [data type] NULL

Zitat aus der ALTER TABLEDokumentation:

NULLkann angegeben werden, um ALTER COLUMNzu erzwingen, dass eine NOT NULLSpalte Nullwerte zulässt, mit Ausnahme von Spalten in PRIMARY KEY-Einschränkungen.

Daniel Vassallo
quelle
22

ALTER TABLE ist richtig:

ALTER TABLE MyCustomers ALTER COLUMN CompanyName VARCHAR(20) NULL
Oded
quelle
2
Sind Sie sicher, dass Sie die Einschränkungen und nur den Datentyp neu definieren müssen? Der MSDN-Artikel erwähnt nicht, dass Einschränkungen neu definiert werden müssten: "Wenn NULL oder NOT NULL mit ALTER COLUMN angegeben wird, muss auch new_data_type [(Genauigkeit [, Skalierung])] angegeben werden. Wenn Datentyp, Genauigkeit und Skalierung wird nicht geändert, geben Sie die aktuellen Spaltenwerte an. "
Daniel Vassallo
@ Daniel Vassallo - Du hast recht. Ich habe versucht, vollständig zu sein, aber das Ändern von NULL / NOT NULL sollte die einzige Änderung sein.
Oded
5

Für MySQL MariaDB

ALTER TABLE [table name] MODIFY COLUMN [column name] [data type] NULL

Verwenden Sie MODIFY COLUMNanstelle von ALTER COLUMN.

Vijay Nandwana
quelle
4
ALTER TABLE public.contract_termination_requests
ALTER COLUMN management_company_id DROP NOT NULL;
laxmi kalake
quelle
2
@ ÁronLőrincz Die Frage bezieht sich jedoch nicht auf Postgres. Es ist mit SQL Server gekennzeichnet, daher ist diese Antwort falsch.
Martin Smith
Sie haben Recht, aber es hat mir trotzdem geholfen und ich denke, es ist ein nützlicher Kommentar für Leute, die die Frage über Google finden. Der Titel der Frage macht nicht deutlich, um welchen Datenbankserver es sich handelt.
Aron Lorincz
1

Ich habe dies geschrieben, damit ich alle Tabellen und Spalten gleichzeitig auf null bearbeiten kann:

select 
case
when sc.max_length = '-1' and st.name in ('char','decimal','nvarchar','varchar')
then
'alter table  [' + so.name + '] alter column [' + sc.name + '] ' + st.name + '(MAX) NULL'
when st.name in ('char','decimal','nvarchar','varchar')
then
'alter table  [' + so.name + '] alter column [' + sc.name + '] ' + st.name + '(' + cast(sc.max_length as varchar(4)) + ') NULL'
else
'alter table  [' + so.name + '] alter column [' + sc.name + '] ' + st.name + ' NULL'
end as query
from sys.columns sc
inner join sys.types st on st.system_type_id = sc.system_type_id
inner join sys.objects so on so.object_id = sc.object_id
where so.type = 'U'
and st.name <> 'timestamp'
order by st.name
Jeffrey Pallatt
quelle
1

Dies ist der Ansatz, um dies zu tun:

  1. Überprüfen Sie, ob die Tabelle oder Spalte vorhanden ist oder nicht.
  2. Wenn ja, ändern Sie die Spalte. z.B:-
IF EXISTS (SELECT 1 FROM INFORMATION_SCHEMA.COLUMNS WHERE 
            TABLE_CATALOG = 'DBName' AND 
            TABLE_SCHEMA = 'SchemaName' AND
            TABLE_NAME = 'TableName' AND
            COLUMN_NAME = 'ColumnName')
BEGIN
    ALTER TABLE DBName.SchemaName.TableName ALTER COLUMN ColumnName [data type] NULL
END  

Wenn Sie kein Schema haben, löschen Sie die Schemazeile, da Sie das Standardschema nicht angeben müssen.

Tilak Dewangan
quelle
0

Der einfachste Weg ist also:

alter table table_name change column_name column_name int(11) NULL;
Mohsin Younas
quelle