Girişi birkaç farklı dizeyle sınırla


12

Merhaba postgreSQL beklediğim gibi çalışan bir kısıtlama almak gibi görünmüyor. Pgadmin içinden aşağıdaki SQL sorgusunu çalıştırıyorum.

-- Check: "TypeCheck"

-- ALTER TABLE "ComLog" DROP CONSTRAINT "TypeCheck";

ALTER TABLE "ComLog"
  ADD CONSTRAINT "TypeCheck" CHECK ("Type" SIMILAR TO 'email|post|IRL|minutes');
COMMENT ON CONSTRAINT "TypeCheck" ON "ComLog" IS 'One of email|post|IRL|minutes';

Yürütüldüğünde bu dönüştürülür.

-- Check: "TypeCheck"

-- ALTER TABLE "ComLog" DROP CONSTRAINT "TypeCheck";

ALTER TABLE "ComLog"
  ADD CONSTRAINT "TypeCheck" CHECK ("Type" ~ similar_escape('email|post|IRL|minutes'::text, NULL::text));
COMMENT ON CONSTRAINT "TypeCheck" ON "ComLog" IS 'One of email|post|IRL|minutes';

Bunun, Türler sütunu için girişimi e-posta gönderimi IRL veya dakikalarından biriyle sınırlandırmasını bekliyorum. Ancak tablo verileri girerken bu türlerden birini girdiğinizde bu kısıtlama başarısız olur. Türler sütunu karakter türündedir. Herkes bunu nasıl düzeltebileceğini biliyor mu? Teşekkürler.


3
Bir şeyi anlamadığım sürece okuması daha kolay olmayacak bir neden var CHECK (type in ('email','post','IRL','minutes')mı?
rfusca

Yanıtlar:


16

Kısıtınızı şununla değiştirin:

CHECK (type IN ('email','post','IRL','minutes'))

Bu ayrıştırıcı tarafından şu biçime dönüştürülecektir:

CHECK (type = ANY( ARRAY['email','post','IRL','minutes']))

Baktığın şeyi yapmalı.

Ancak bunu yapmak daha iyi olmaz mıydı merak etmeliyim:

CREATE TABLE comlog_types (
     type text
);

Ve sonra kısıtlamayı uygulamak için yabancı bir anahtar ekleyin. Bu, gelecekte tür eklemeyi kolaylaştıracaktır.


Teşekkürler, bu mükemmel bir şekilde çözüldü. Gelecekte yabancı anahtar yöntemine geçmeyi düşünebilirim.
wookie1

2
Evet, iyi çalışıyor. Ancak PostgreSQL'in numaralandırma veri türüne de göz atmak isteyebilirsiniz .
XåpplI'-I0llwlg'I -
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.