Batasi input ke beberapa string yang berbeda

11

Hai Saya sepertinya tidak bisa mendapatkan kendala yang bekerja seperti yang saya harapkan di postgreSQL. Dari dalam pgadmin saya menjalankan query SQL berikut.

-- 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';

Ketika dieksekusi ini dikonversi menjadi.

-- 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';

Saya berharap ini akan membatasi input saya untuk kolom Jenis ke salah satu pos email IRL atau menit. Namun ketika memasukkan data tabel kendala ini gagal ketika saya memasukkan salah satu dari jenis ini. Kolom Jenis adalah tipe karakter. Adakah yang tahu cara memperbaikinya? Terima kasih.

wookie1
sumber
3
Kecuali jika saya tidak memahami sesuatu, apakah ada alasan mengapa itu tidak mudah dibaca CHECK (type in ('email','post','IRL','minutes')?
rfusca

Jawaban:

15

Ubah kendala Anda menjadi

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

Ini akan dikonversi oleh pengurai menjadi:

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

Itu harus melakukan apa yang Anda lihat.

Namun saya harus bertanya-tanya apakah tidak akan lebih baik untuk melakukan ini:

CREATE TABLE comlog_types (
     type text
);

Dan kemudian menambahkan kunci asing untuk menegakkan batasan tersebut. Ini akan memudahkan untuk menambahkan tipe di masa mendatang.

Chris Travers
sumber
Terima kasih, itu menyelesaikannya dengan sempurna. Saya mungkin melihat ke dalam perubahan ke metode kunci asing di masa depan.
wookie1
2
Ya, itu bekerja dengan baik. Tetapi Anda mungkin juga ingin memeriksa tipe data enum PostgreSQL .
XåpplI'-I0llwlg'I -