Ubah tabel: Cara mengubah atribut 'Izinkan Nulls' dari bukan nol untuk mengizinkan nol


207

Bagaimana mengubah satu atribut dalam tabel menggunakan T-SQL untuk memungkinkan nulls (bukan null -> null)? Mengubah tabel mungkin?


12
SQL Server Management Studio membuat skrip yang sangat kompleks untuk tugas yang begitu sederhana. Itu sebabnya saya bingung dan memeriksa stackoverflow. Mungkin itulah inti dari pertanyaan ...
Tillito

Jawaban:


363
-- replace NVARCHAR(42) with the actual type of your column
ALTER TABLE your_table
ALTER COLUMN your_column NVARCHAR(42) NULL

4
Atau sama ALTER TABLE your_table ALTER COLUMN your_column NVARCHAR(42)seperti itu akan secara default mengizinkan nulls tetap jika tidak ditentukan secara eksplisit sebaliknya.
Martin Smith

3
Catatan jika perlu mengubah beberapa kolom untuk memungkinkan nol, maka Anda harus melakukan ALTER TABLE .. ALTER COLUMN ..perintah terpisah
sonyisda1

2
Perhatikan ada beberapa kasus di mana ini mungkin tidak berhasil - lihat jawaban DBA Stack Exchange ini jika Anda mendapatkanALTER TABLE ALTER COLUMN failed because one or more objects access this column.
Jarrod Dixon

49

Ya, Anda dapat menggunakan ALTER TABLEsebagai berikut:

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

Mengutip dari ALTER TABLEdokumentasi:

NULLdapat ditentukan dalam ALTER COLUMNuntuk memaksa NOT NULLkolom untuk memungkinkan nilai nol, kecuali untuk kolom dalam batasan PRIMARY KEY.


22

ALTER TABLE benar:

ALTER TABLE MyCustomers ALTER COLUMN CompanyName VARCHAR(20) NULL

2
Apakah Anda yakin Anda perlu mendefinisikan ulang kendala, dan hanya tipe datanya? Artikel MSDN tidak menyebutkan bahwa kendala perlu didefinisikan ulang: "Jika NULL atau NOT NULL ditentukan dengan ALTER COLUM, new_data_type [(presisi [, skala])] juga harus ditentukan. Jika tipe data, presisi, dan skala tidak diubah, tentukan nilai kolom saat ini. "
Daniel Vassallo

@Daniel Vassallo - Anda benar. Saya sedang mencoba untuk menyelesaikan, tetapi mengubah NULL / NOT NULL harus menjadi satu-satunya perubahan.
Oded

5

Untuk MySQL, MariaDB

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

Gunakan MODIFY COLUMNsebagai ganti ALTER COLUMN.


4
ALTER TABLE public.contract_termination_requests
ALTER COLUMN management_company_id DROP NOT NULL;

2
@ ÁronLőrincz pertanyaannya bukan tentang Postgres. Itu ditandai SQL Server sehingga jawaban ini salah.
Martin Smith

Anda benar, tetapi itu masih membantu saya dan saya pikir ini adalah komentar yang berguna bagi orang-orang yang menemukan pertanyaan melalui Google. Judul pertanyaan tidak memperjelas server basis data mana.
Aron Lorincz

1

Saya menulis ini agar saya bisa mengedit semua tabel dan kolom menjadi nol sekaligus:

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

1

Ini adalah pendekatan untuk melakukan ini: -

  1. Periksa apakah tabel atau kolom ada atau tidak.
  2. Jika ya, maka ubah kolom. misalnya:-
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  

Jika Anda tidak memiliki skema apa pun, hapus baris skema karena Anda tidak perlu memberikan skema default.


0

Jadi cara paling sederhana adalah,

alter table table_name change column_name column_name int(11) NULL;
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.