mevcut bir tabloya NOT NULL sütunu ekle


122

Denedim:

ALTER TABLE MY_TABLE 
ADD STAGE INT NOT NULL;

Ancak şu hata mesajını veriyor:

ALTER TABLE yalnızca boş değerler içerebilen veya bir VARSAYILAN tanımı belirtilen sütunların eklenmesine izin verir

Yanıtlar:


223

Bir seçenek olarak, başlangıçta Null olabilen sütun oluşturabilir, ardından tablo sütununuzu geçerli boş olmayan değerlerle güncelleyebilir ve son olarak, NOT NULL kısıtını ayarlamak için ALTER sütununu değiştirebilirsiniz:

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

Diğer bir seçenek, sütununuz için doğru varsayılan değeri belirlemektir:

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

UPD: Lütfen yukarıdaki cevabın GO, bu kodu Microsoft SQL sunucusunda çalıştırdığınızda gerekli olanı içerdiğini unutmayın . Oracle veya MySQL'de aynı işlemi gerçekleştirmek istiyorsanız, şu şekilde noktalı virgül kullanmanız gerekir ;:

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;

1
Şahsen ben burada birinci yolu tercih ediyorum, eğer değerleriniz varsa, alana manuel olarak koyabilirsiniz. Bu şekilde, ihtiyacınız olmayan bir varsayılan kısıtlama oluşturma ve silme konusunda endişelenmenize gerek kalmaz.
Mark W Dickson

1
@acarlon - Bence bu ulaşıyor. Bahsettiğiniz tehlikeli updateifade, herhangi bir sorguda zararlı olacaktır. updateBuradaki ifadede fazladan bir sütununuz olup olmadığını görmek yeterince basit olmalıdır . Genelde bir seferde yalnızca bir veya iki sütun eklersiniz. updateİfadenize oraya ait olmayan fazladan bir sütun eklerseniz , bu örnekte, belki de ilk etapta verilerden sorumlu olmamanız gerekir.
Mark W Dickson

2
SQLite kullanan ANDROID Geliştiricileri, bunun SQLite tarafından ALTER COLUMNdesteklenmediğini unutmayın.
Sdghasemi

2
Daha önce hiç görmedim GOve SQL spesifikasyonunun bir parçası değil gibi görünüyor , bu nedenle muhtemelen onu destekleyen araçlardan biri tarafından çalıştırılmayan komut dosyalarının başarısızlığına yol açacaktır. Sadece noktalı virgül mü kullanıyorsunuz? Herhangi bir yerleşik ve makul standardı nadiren önemsedikleri için Microsoft standartlarının yayılmasını önermiyorum, sadece kendi icatlarını elde etmek için kendi standartlarını icat ediyorum. Bunun dışında faydalı cevap.
Neonit

2
@Neon yorum için teşekkürler, ama asıl soru MS SQL sunucusuydu, bu yüzden GO orada. Ama cevabıma bununla ilgili bir not ekleyeceğim.
Pavel Morshenyuk

13

Sütunun Null olmasına izin vermiyorsanız, mevcut satırları doldurmak için bir varsayılan sağlamanız gerekir. Örneğin

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

Enterprise Edition'da bu, 2012'den beri yalnızca meta veri değişikliğidir


2
Sen yok ihtiyaç için, ama bir seçenektir.
Matt

6

Hata mesajı oldukça açıklayıcıdır, şunu deneyin:

ALTER TABLE MyTable ADD Stage INT NOT NULL DEFAULT '-';

ve varsayılan bölümdeki "eksi" nin anlamı nedir?
Mladen B.

3

Diğer SQL uygulamalarının da benzer kısıtlamaları vardır. Bunun nedeni, bir sütun eklemek için varsayılan değer olan bu sütun için (mantıksal olarak, fiziksel olarak olmasa bile) değerler eklemeyi gerektirmesidir NULL. İzin vermezseniz NULLve bir a sahip değilseniz default, değer ne olur?

SQL Server desteklediğinden ADD CONSTRAINT, Pavel'in null yapılabilir bir sütun oluşturma yaklaşımını ve ardından NOT NULLonu NULLdeğer olmayanlarla doldurduktan sonra bir kısıtlama eklemesini öneririm .


MySQL, veri içeren mevcut tabloya boş olmayan sütunlar eklemeyi destekler, burada veri türü için "mantıklı" boş değer mevcut satırlara sağlanır (yani float için 0.0, tamsayı için 0, dize için boş dize, vb.).
Michael Tsang

2

Bu benim için çalıştı, ayrıca tasarım görünümünden "ödünç alınabilir", değişiklikler yapın -> sağ tıklayın -> değişiklik betiği oluşturun.

BEGIN TRANSACTION
GO
ALTER TABLE dbo.YOURTABLE ADD
    YOURCOLUMN bit NOT NULL CONSTRAINT DF_YOURTABLE_YOURCOLUMN DEFAULT 0
GO
COMMIT

1
ALTER TABLE `MY_TABLE` ADD COLUMN `STAGE` INTEGER UNSIGNED NOT NULL AFTER `PREV_COLUMN`;

0
Alter TABLE 'TARGET' add 'ShouldAddColumn' Integer Not Null default "0"

1
Bu cevap bu konuya ne katıyor?
barbsan
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.