SQL Sütun tanımı: varsayılan değer ve boş gereksiz değil mi?


88

DDL deyiminde oluştur / değiştir ifadesinde bir sütunu tanımlayan aşağıdaki sözdizimini defalarca gördüm:

ALTER TABLE tbl ADD COLUMN col VARCHAR(20) NOT NULL DEFAULT "MyDefault"

Soru şudur: varsayılan bir değer belirtildiğinden, sütunun NULL'leri kabul etmemesi gerektiğini de belirtmek gerekir mi? Diğer bir deyişle, DEFAULT NOT NULL gereksiz hale getirmez mi?

Yanıtlar:


133

DEFAULTbir insert / update deyiminde açık bir değer olmadığında eklenecek olan değerdir. DDL'nizin NOT NULLkısıtlamaya sahip olmadığını varsayalım :

ALTER TABLE tbl ADD COLUMN col VARCHAR(20) DEFAULT 'MyDefault'

Sonra bu ifadeleri yayınlayabilirsiniz

-- 1. This will insert 'MyDefault' into tbl.col
INSERT INTO tbl (A, B) VALUES (NULL, NULL);

-- 2. This will insert 'MyDefault' into tbl.col
INSERT INTO tbl (A, B, col) VALUES (NULL, NULL, DEFAULT);

-- 3. This will insert 'MyDefault' into tbl.col
INSERT INTO tbl (A, B, col) DEFAULT VALUES;

-- 4. This will insert NULL into tbl.col
INSERT INTO tbl (A, B, col) VALUES (NULL, NULL, NULL);

Alternatif olarak, kullanabilirsiniz DEFAULTiçinde UPDATEuygun ifadeleri SQL 1992 standardına:

-- 5. This will update 'MyDefault' into tbl.col
UPDATE tbl SET col = DEFAULT;

-- 6. This will update NULL into tbl.col
UPDATE tbl SET col = NULL;

Not, tüm veritabanları bu standart SQL sözdizimlerinin tümünü desteklemez. NOT NULLKısıtlama eklemek, ifadeler hala geçerli 4, 6olsa 1-3, 5da ifadelerde bir hataya neden olur . Yani sorunuzu cevaplamak için: Hayır, gereksiz değiller.


Sorgu performansı üzerindeki muazzam etkinin bir açıklamasını (muhtemelen bazı rakamlarla) görmeyi umarak bağlantınıza (blog gönderinize) gittim, ancak yalnızca bir etkisi olduğunu kısaca yeniden ifade ettiğini gördüm. Alınma ama bağlantı biraz yanıltıcı.
Seth Flowers

@SethFlowers: İşaretçi için teşekkürler Seth. Bağlantılı makale bu arada düzenlendi. Bunun yerine başka bir şey bağlayıp bağlayamayacağıma veya bağlantıyı kaldırıp kaldıramayacağıma bakacağım. Şimdi olduğu gibi kesinlikle haklısınız, buradaki cevaba herhangi bir değer katmıyor.
Lukas Eder

Teşekkürler - umarım kaba gelmemişimdir. Bağlantıyı yeni gördüm ve "evet, kesinlikle okumak istediğim bir şey" dedim - sonra biraz hayal kırıklığına uğradım :).
Seth Çiçek

@SethFlowers: Endişelenme. Tamamen katılıyorum. Kurtulmam için: Blog yazma becerilerim son yıllarda büyük ölçüde gelişti :)
Lukas Eder

19

Varsayılan bir değerle bile, sütun verilerini her zaman ile geçersiz kılabilirsiniz null.

NOT NULLO ile oluşturuldu sonra kısıtlama söz konusu satır güncellemesine izin vermez nulldeğeri


Bunun yeniden ifade edilmesi gerektiğini düşünüyorum: "NOT NULL kısıtlaması, bu satırı boş değerle oluşturulduktan sonra güncellemenize izin vermez" Tabii ki NOT NULL sütunları olan satırlar güncellenebilir, sadece bir bu sütun için değer. Ayrıca: Bir satır oluşturmanın bir satır eklemek anlamına geldiğini varsayıyorum. INSERT deyimleri de NOT NULL ile belirtilen sütunlar için boş değerlere sahip olamaz.
makrom

4

SQL öğretmenim, hem bir DEFAULTdeğer belirtirseniz hem de NOT NULLveya NULL, DEFAULTher zaman NOT NULLveya öncesinde ifade edilmesi gerektiğini söyledi NULL.

Bunun gibi:

ALTER TABLE tbl ADD COLUMN col VARCHAR(20) DEFAULT "MyDefault" NOT NULL

ALTER TABLE tbl ADD COLUMN col VARCHAR(20) DEFAULT "MyDefault" NULL


5
Merhaba, katıldığınız için teşekkürler. Yine de bu, eldeki soruyu ele almıyor ve her iki sıralama da tamamen etkili. Tabloları manuel olarak yazarken varsayılanı sonuna koymayı daha kolay buluyorum çünkü o zaman NULL ve NOT NULL değerleri daha iyi hizalanır.
emragins

Tamam, sanırım sen de haklısın. Kursumun cevabıma yazdıklarımı neden açıkça söylediğini anlamıyorum. Cevabımın soruyu gerçekten ele almadığını biliyorum, ancak bir yorumun pek okunaklı olmadığını anladım.
Tanguy Labrador Ruiz

3
(Öznel) en iyi uygulama ve kurallar arasında bir fark vardır. Tutarlı bir stile sahip olmak kötü bir fikir değil, ancak bu özel durumda, kişisel olarak DEFAULT'tan önce NOT NULL'u tercih ederim. Ne olursa olsun, cevaplar yerine yorum da yazabilirsiniz, bu daha uygun olurdu.
MAKROM

Muhtemelen bu soruya cevap vermiyor. Ama tam olarak aradığım buydu. Teşekkür ederim.
Sasuke Uchiha

2

Ben hayır derdim.

Sütun boş değerleri kabul etmiyorsa, alana boş değer eklemenizi engelleyecek hiçbir şey yoktur. Bildiğim kadarıyla, varsayılan değer yalnızca yeni bir satır oluşturulduğunda geçerlidir.

Boş küme olmadığında, bir hata oluşturacağı için alana boş bir değer ekleyemezsiniz.

Boşlukları önlemek için güvenli bir mekanizma olarak düşünün.


2
'Yeni bir kural yaratın' dediniz. 'Yeni bir sıra yaratmak' demeyi düşündünüz mü?
bielawski

Bunun bu sorunun daha pratik bir cevabı olduğunu düşünüyorum.
Noman_ibrahim

@bielawski Ve yaklaşık 8 yıl sonra, bu yazım hatasını düzeltmeye başladım :)
Dark Hippo

Bu kabul edilen cevap olmalıdır. OP basit bir soru sorar ve cevap basitçe "hayır" dır. Yine de dokümantasyon için açıklama ve örnek gereklidir.
Nicolas Hevia

0

Diğer bir deyişle, DEFAULT NOT NULL gereksiz hale getirmez mi?

Hayır, gereksiz değildir. Genişletilmiş kabul edilmiş cevaba. colBoş değer atanabilir sütun için , DEFAULT tanımlandığında bile NULL ekleyebilir:

CREATE TABLE t(id INT PRIMARY KEY, col INT DEFAULT 10);

-- we just inserted NULL into column with DEFAULT
INSERT INTO t(id, col) VALUES(1, NULL);

+-----+------+
| ID  | COL  |
+-----+------+
|   1 | null |
+-----+------+

Oracle, bu tür bir senaryo için açık NULL'u varsayılan olarak geçersiz kılmak için ek sözdizimi getirdi DEFAULT ON NULL:

CREATE TABLE t2(id INT PRIMARY KEY, col INT DEFAULT ON NULL 10);
-- same as
--CREATE TABLE t2(id INT PRIMARY KEY, col INT DEFAULT ON NULL 10 NOT NULL); 

INSERT INTO t2(id, col) VALUES(1, NULL);

+-----+-----+
| ID  | COL |
+-----+-----+
|  1  |  10 |
+-----+-----+

Burada NULL eklemeye çalıştık, ancak bunun yerine varsayılanı aldık.

db <> fiddle demosu

BOŞ

ON NULL yan tümcesini belirtirseniz, Oracle Database, sonraki bir INSERT deyimi NULL olarak değerlendirilen bir değer atamaya çalıştığında VARSAYILAN sütun değerini atar.

ON NULL belirttiğinizde, NOT NULL kısıtlaması ve NOT DEFERRABLE kısıtlama durumu örtük olarak belirtilir.

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.