Ràng buộc đầu vào một vài chuỗi khác nhau


11

Xin chào Tôi dường như không thể có được một ràng buộc làm việc theo cách tôi mong đợi trong postgreSQL. Từ trong pgadmin tôi thực hiện truy vấn SQL sau.

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

Khi thực hiện điều này được chuyển đổi thành.

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

Tôi hy vọng điều này sẽ giới hạn đầu vào của tôi cho cột Loại vào một trong những bài đăng email IRL hoặc phút. Tuy nhiên, khi nhập dữ liệu bảng, ràng buộc này không thành công khi tôi nhập một trong các loại này. Cột Loại là loại ký tự. Có ai biết làm thế nào để sửa lỗi này. Cảm ơn.


3
Trừ khi tôi không hiểu điều gì đó, có lý do gì để đọc dễ dàng hơn không CHECK (type in ('email','post','IRL','minutes')?
rfusca

Câu trả lời:


15

Thay đổi ràng buộc của bạn thành

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

Điều này sẽ được chuyển đổi bởi trình phân tích cú pháp thành:

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

Điều đó nên làm những gì bạn đang nhìn.

Tuy nhiên tôi phải tự hỏi liệu sẽ tốt hơn nếu làm điều này:

CREATE TABLE comlog_types (
     type text
);

Và sau đó thêm một khóa ngoại để thực thi các ràng buộc. Điều này sẽ làm cho nó dễ dàng hơn để thêm các loại trong tương lai.


Cảm ơn, điều đó đã giải quyết nó một cách hoàn hảo. Tôi có thể xem xét việc thay đổi phương thức khóa ngoại trong tương lai.
wookie1

2
Vâng, nó hoạt động độc đáo. Nhưng bạn cũng có thể muốn kiểm tra kiểu dữ liệu enum của PostgreSQL .
XåpplI'-I0llwlg'I - 24/2/2015
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.