2015-04-10 10 views
5

character varying(NN) yerine PostgreSQL (veya onu destekleyen bazı diğer veritabanları) kullanırken TEXT veri türünün kullanılması tercih edilir, çünkü performans cezası yoktur ve maksimum olası uzunluk, alanı kullanan herhangi bir görüşü vb. etkilemeden kısıtlamaların düşürülmesi ve yeniden uygulanmasıyla ayarlanabilir.Bir metin alanına uzunluk sınırı ekleme

Ancak, bu kısıtlama nasıl uygulanır (SQL kodu)?

Oh, ve ben buna birini kendisi seçmesine izin vermek pgAdmin gibi bir araç ile kısıtlamayı eklerken bir ad atlamak için akıllıca olduğunu varsayalım.

:
+0

Ancak uzunluk denetimi kısıtlaması nvarchar'dan daha verimli olan bir metin sütundur. – jarlh

+0

@jarlh Postgres 'nvarchar' içermiyor –

+0

@jarlh Bkz. Http://www.postgresql.org/docs/current/interactive/datatype-character.html "İpucu: Bu üç tip arasında, boş dolgu türü kullanıldığında artan depolama alanı ve uzunluk sınırlaması olan bir sütuna depolama sırasında uzunluğun kontrol edilmesi için birkaç CPU döngüsü dışında hiçbir performans farkı yoktur." – IMSoP

cevap

12

Eğer bu tür şeyler yapabiliriz tablo oluşturmak

,

CREATE TABLE names (
    name text CHECK namechk (char_length(name) <= 255) 
) 

aynı

örneğin ALTER TABLE için de geçerli (namechk kısıtlaması için sadece bir isim)

ALTER TABLE names 
    ADD CONSTRAINT namechk CHECK (char_length(name) <= 255); 
+1

'char_length' veya 'length' kullanıp kullanmadığım önemli mi? Bu arada, ikincisi kullanarak kısıtlamalar uyguladı ... – Tobias

+1

Karşılaştırma elbette ki <= 255' olmalıdır. – Tobias

+0

'HATA:" namechk "veya yakınında sözdizimi hatası' Tablo oluştururken belirtilirken kısıtlama adını belirleyemiyor gibi görünüyor – deFreitas

2

Burada gerçekten üç şey var:

  1. text + bir kontrol kısıtlaması mı yoksa varchar(N) mu?
  2. Uygun bir kontrol kısıtlaması nasıl yazılır?
  3. Kısıtlamalarınızı adlandırırsanız veya otomatik bir ad verilsin mi?

Yanıtlar:

  1. A varchar(N) şema teftiş ve ne diğer veritabanları gelen geliştiriciler görmeyi bekliyoruz ne zaman daha belirgin olacaktır. Ancak, dediğiniz gibi, daha sonra değiştirmek daha zordur. Yeni/değiştirilmiş bir kontrol kısıtlaması uygulanmasının ücretsiz olmadığını unutmayın - mevcut tüm satırlar kısıtlamalara karşı kontrol edilmelidir, böylece büyük bir masada, çok fazla okuma gereklidir.
  2. Bir çek sınırlaması sözdizimi CONSTRAINT name CHECK (condition) (veya yalnızca CHECK (condition) ve Postgres'in kendisi bir adla birlikte gelir) CREATE TABLE bildirimi ve ALTER TABLE table_name ADD CONSTRAINT name CHECK (condition); ifadesidir. condition, uygun bir string function, örn. char_length(foo) <= 255.
  3. Kısıtlamayı daha sonra yönetmek istiyorsanız, kısıtlama için bir ad eklemek çok yararlıdır. Özellikle, bunu esneklik için kullandığınız için, kısıtlamak ve yeni bir uzunluk ile kısıtlamak için kod yazmak isteyebilirsiniz. Yalnızca grafik araçları kullanıyorsanız, bu bir sorun değildir, ancak değişikliklerinizi betimleyebiliyorsanız birden çok sunucuyu (örneğin geliştirme, deneme ve üretim kopyaları) yönetmek daha kolay hale gelir. Adlandırılmış bir kısıtlama ile bu ALTER TABLE foo DROP CONSTRAINT ck_bar_length; ALTER TABLE foo ADD CONSTRAINT ck_bar_length CHECK (char_length(bar) <= 100); gibi ben aslında bir dezavantajı sizin kısıtlama adlandırma düşünemiyorum.
+0

Evet, elbette kısıtlamanın bir adı olmalıdır; Bu yüzden "pgAdmin gibi bir araçla eklerken" dedim (ki bu da takip etmesi muhtemel olan bir şemayı takip eden bir isim oluşturur). – Tobias

+0

@Tobias Kullandığınız herhangi bir araç, bazı algoritmalara göre oluşturulmuş * bir * isim ile oluşturacaktır. Ancak, farklı zamanlarda farklı yerlerde çalışırken aynı ismi kullanmak * garantili değildir. Dürüstçe kendi isminizi kullanmamanın bir sebebini düşünemiyorum. – IMSoP

+0

Böyle bir garantiye ihtiyacım yok. Etkileşimli aracı * bir kez kullanayım * ve daha sonra gerektiğinde başka yerlerde aynı değişiklikleri uygulamak için ya da dosyalarda saklamak için oluşturduğum SQL kodunu kullanırdım. – Tobias