masukkan kolom NOT NULL ke tabel yang ada

122

Saya telah mencoba:

ALTER TABLE MY_TABLE 
ADD STAGE INT NOT NULL;

Tapi itu memberikan pesan kesalahan ini:

ALTER TABLE hanya mengizinkan kolom yang akan ditambahkan yang dapat berisi null atau memiliki definisi DEFAULT yang ditentukan

ANP
sumber

Jawaban:

223

Sebagai opsi, Anda awalnya dapat membuat kolom Null -able, kemudian memperbarui kolom tabel Anda dengan nilai yang valid bukan null dan terakhir kolom ALTER untuk menyetel batasan NOT NULL:

ALTER TABLE MY_TABLE ADD STAGE INT NULL
GO
UPDATE MY_TABLE SET <a valid not null values for your column>
GO
ALTER TABLE MY_TABLE ALTER COLUMN STAGE INT NOT NULL
GO

Opsi lainnya adalah menentukan nilai default yang benar untuk kolom Anda:

ALTER TABLE MY_TABLE ADD STAGE INT NOT NULL DEFAULT '0'

UPD: Harap dicatat bahwa jawaban di atas berisi GOyang menjadi keharusan ketika Anda menjalankan kode ini di server Microsoft SQL. Jika Anda ingin melakukan operasi yang sama di Oracle atau MySQL, Anda perlu menggunakan titik koma ;seperti itu:

ALTER TABLE MY_TABLE ADD STAGE INT NULL;
UPDATE MY_TABLE SET <a valid not null values for your column>;
ALTER TABLE MY_TABLE ALTER COLUMN STAGE INT NOT NULL;
Pavel Morshenyuk
sumber
1
Saya pribadi lebih suka cara pertama di sini jika Anda memiliki nilai yang dapat Anda masukkan ke lapangan secara manual. Dengan begitu Anda tidak perlu khawatir tentang membuat dan menghapus batasan default yang tidak Anda perlukan.
Mark W Dickson
1
@ Acarlon - Saya pikir itu mencapai. updatePernyataan berbahaya yang Anda sebutkan akan merugikan kueri apa pun. Ini harus cukup sederhana untuk melihat apakah Anda memiliki kolom tambahan dalam updatepernyataan di sini. Anda biasanya hanya akan menambahkan satu atau dua kolom pada satu waktu. Jika Anda kebetulan menambahkan kolom tambahan ke dalam updatepernyataan Anda yang tidak termasuk di sana, dalam contoh ini, mungkin Anda tidak seharusnya bertanggung jawab atas data sejak awal.
Mark W Dickson
2
Pengembang ANDROID yang menggunakan SQLite harus berhati-hati karena ALTER COLUMNTIDAK didukung di SQLite.
Sdghasemi
2
Saya belum pernah melihat GOsebelumnya dan tampaknya bukan bagian dari spesifikasi SQL , sehingga mungkin akan menyebabkan kegagalan skrip yang tidak dijalankan oleh salah satu alat yang mendukungnya. Cukup gunakan titik koma? Saya tidak merekomendasikan menyebarkan standar Microsoft karena mereka jarang peduli dengan standar yang mapan dan masuk akal, tetapi menciptakan standar mereka sendiri hanya untuk menemukan sendiri. Selain itu, jawaban yang membantu.
Neonit
2
@Neon terima kasih atas komentarnya, tetapi pertanyaan asli adalah tentang server MS SQL, itulah mengapa GO ada di sana. Tapi saya akan menambahkan catatan tentang itu pada jawaban saya.
Pavel Morshenyuk
13

Jika Anda tidak mengizinkan kolom menjadi Null, Anda perlu memberikan default untuk mengisi baris yang ada. misalnya

ALTER TABLE dbo.YourTbl ADD
    newcol int NOT NULL CONSTRAINT DF_YourTbl_newcol DEFAULT 0

Pada Edisi Perusahaan, ini hanya metadata yang berubah sejak 2012

Martin Smith
sumber
2
Anda tidak perlu melakukannya, tetapi ini adalah salah satu pilihan.
Matt
6

Pesan kesalahan cukup deskriptif, coba:

ALTER TABLE MyTable ADD Stage INT NOT NULL DEFAULT '-';
a'r
sumber
dan apa arti dari "minus" di bagian default?
Mladen B.
3

Implementasi SQL lainnya memiliki batasan serupa. Alasannya adalah bahwa menambahkan kolom memerlukan penambahan nilai untuk kolom tersebut (secara logis, meskipun tidak secara fisik), yang defaultnya NULL. Jika Anda tidak mengizinkan NULL, dan tidak memiliki default, berapa nilainya?

Karena SQL Server mendukung ADD CONSTRAINT, saya akan merekomendasikan pendekatan Pavel untuk membuat kolom nullable, dan kemudian menambahkan NOT NULLbatasan setelah Anda mengisinya dengan non- NULLnilai.

dan04
sumber
MySQL mendukung penambahan kolom bukan null ke dalam tabel yang sudah ada dengan data, di mana nilai kosong yang "masuk akal" untuk tipe data diberikan ke baris yang ada (misalnya 0,0 untuk float, 0 untuk integer, string kosong untuk string, dll).
Michael Tsang
2

Ini berhasil untuk saya, juga bisa "dipinjam" dari tampilan desain, buat perubahan -> klik kanan -> buat skrip ubah.

BEGIN TRANSACTION
GO
ALTER TABLE dbo.YOURTABLE ADD
    YOURCOLUMN bit NOT NULL CONSTRAINT DF_YOURTABLE_YOURCOLUMN DEFAULT 0
GO
COMMIT
pabbie
sumber
1
ALTER TABLE `MY_TABLE` ADD COLUMN `STAGE` INTEGER UNSIGNED NOT NULL AFTER `PREV_COLUMN`;
ajoejoseph
sumber
0
Alter TABLE 'TARGET' add 'ShouldAddColumn' Integer Not Null default "0"
AKronis1369
sumber
1
Apa jawaban ini menambah topik ini?
barbsan