2009-02-04 32 views
180

I (Internet için ayıklanmış) aşağıdaki sorguyu kullanarak Postgresql veritabanına yeni, "NOT NULL" sütun ekleyerek ediyorum:Postgresql veritabanına, boş değerlere izin vermeyen bir sütunu nasıl ekleyebilirim?

ALTER TABLE mytable ADD COLUMN mycolumn character varying(50) NOT NULL; 

bu sorgu çalıştırmak her zaman, aşağıdaki hata iletisini alırsınız:

ERROR: column "mycolumn" contains null values 
stumped. Nerede yanlış gidiyorum?

NOT: Önce pgAdmin III (1.8.4) kullanıyorum, ancak SQL'i Terminal'in içinden çalıştırdığımda da aynı hatayı aldım.

cevap

305

Bir varsayılan değer ayarlamanız gerekir.

ALTER TABLE mytable ADD COLUMN mycolumn character varying(50) NOT NULL DEFAULT 'foo'; 

... some work (set real values as you want)... 

ALTER TABLE mytable ALTER COLUMN mycolumn DROP DEFAULT; 
+1

Güzel bir çözüm. Bu nedenle sözdiziminin ne olacağını görmek için bazı çevrimiçi dokümanlar dokümanlarına ulaşamadım. –

+3

@SeanBright, "ALTER_TABLE" adlı kişiyi kullanarak çevrimdışı dokümanlar dokusuna erişebilirsiniz :) –

+0

@ allan.simon Daha önce hiç PostgreSQL kullanmamıştım ve hiçbir yere kurulmamış. –

47

Tabloda zaten satırlar bulunduğundan, ALTER deyimi, varolan tüm satırlar için yeni oluşturulan sütuna NULL eklemeye çalışıyor. Sütunu NULL'a izin vermek olarak eklemeniz, ardından sütunu istediğiniz değerlerle doldurmanız ve daha sonra NOT NULL olarak ayarlamanız gerekir.

+6

örneği. Aksi takdirde, Luc'un çözümü daha eksiksiz ve kullanıma hazır görünüyor. –

+1

Bir örnek için bu cevaba bakın: http://stackoverflow.com/a/516016/32453 – rogerdpack

5

Ya bir varsayılanı tanımlamanız ya da Sean'ın söylediği şeyi yapıp varolan satırlarda dolduruncaya kadar boş sınırlama olmadan eklemeniz gerekir.

1

Veya, ek sütunu ile yeni bir tablo oluşturun ve null olmayan yeni sütunu doldurmak için gerektiği şekilde işlerken bu yeni tabloya verileri kopyalayın ve ardından tabloyu iki adımlı bir ad değişikliğiyle değiştirin. .

Evet, daha karmaşıktır, ancak canlı bir tabloda büyük bir UPDATE istemiyorsanız, bu şekilde yapmanız gerekebilir.

+3

Ben siz yapmadım, ama sanırım bununla ilgili ince zorluklar olabilir - örn. Bahse girerim ki, mevcut indeksler, tetikleyiciler ve görüşler, adından çok tabloyu (değişmeyen) sakladıklarını düşündüğümde, yeniden adlandırıldıktan sonra bile orijinal tabloya başvurmaya devam edecektir. –

+1

Evet, yeni tablonun, indeksler ve benzerleri dahil olmak üzere aslının tam bir kopyası olması gerektiğini belirtmeliydim. Çok kısa olduğum için kötüyüm. Bunun nedeni, canlı olabilecek bir tablo üzerinde bir ALTER gerçekleştirmenin ince farklılıkları olduğu ve bazen de onu sahneye koymanız gerektiğidir. – alphadogg

+0

Örneğin, DEFAULT yaklaşımını kullanarak, her bir satıra bu varsayılan değeri eklersiniz. Bunu yaparken Postgres'in bir masayı nasıl kilitlediğinden emin değilsiniz. Veya sütun siparişi önemliyse, ALTER komutuna sahip bir sütun ekleyemezsiniz. – alphadogg

2

Varsayılan bir değerin uygun olduğu varsayılarak, bir varsayılan değerin belirtilmesi de işe yarar.

+1

Varsayılan bir değerle (şekil için) sütun oluşturmak için değiştirilmiş sözdizimini vermek yanıtı iyileştirir. – hardmath

52

Diğerlerinin de gözlemlediği gibi, ya bir null sütun oluşturmalı ya da bir VARSAYILAN değer sağlamalısınız. o kadar esnek değilse (örn Yeni değeri tek tek her nasılsa, her satır için hesaplanan gerekiyorsa), PostgreSQL içinde, bütün DDL komutları bir hareket içinde infaz edilebilir gerçeğini kullanabilirsiniz:

BEGIN; 
ALTER TABLE mytable ADD COLUMN mycolumn character varying(50); 
UPDATE mytable SET mycolumn = timeofday(); -- Just a silly example 
ALTER TABLE mytable ALTER COLUMN mycolumn SET NOT NULL; 
COMMIT; 
+1

bile bir işlemde, NULL değil derhal zorlanır, bu yüzden önce sütun ekleyin, değerleri doldurun, sonra NOT NULL - bu yanıtın yaptığı gibi ekleyin. (postgres 9.6 üzerinde test edilmiştir) –

0

bu sorgu Bu benim için çalıştı boş değerlere

ALTER TABLE mytable ADD COLUMN mycolumn character varying(50) DEFAULT 'whatever' NOT NULL; 
-3

otomatik güncellenecektir: :) gerçekten güzel olurdu nasıl yapılacağı

ALTER TABLE your_table_name ADD COLUMN new_column_name int; 
+1

Sorgunuzda '' NOT NULL' kısıtlaması yok. Tabii ki çalışıyor. – Sylvain

İlgili konular