2012-02-20 32 views

Trả lời

10

Tôi không chắc chắn nếu điều này là những gì bạn đang tìm kiếm, nhưng bạn sẽ có thể làm là sử dụng một hạn chế kiểm tra:

CREATE TABLE My_Table(my_column varchar(255) 
    check (my_column in ('first', 'second', 'last'))); 

-- fails: 
insert into My_Table values('x'); 

-- ok: 
insert into My_Table values('first'); 

này sẽ làm việc trong H2, Apache Derby, PostgreSQL, HSQLDB, và ngay cả SQLite. Tôi đã không kiểm tra cơ sở dữ liệu khác.

+0

Nhân tiện, có thể là một enum và một bảng tham chiếu hiệu quả hơn. –

+0

Việc nắm bắt là không có cách nào để liệt kê các giá trị có thể với giải pháp này (mặc dù ông có thể không cần nó). – Viruzzo

+0

Bạn có nghĩa là bạn không biết các giá trị có thể có? Làm thế nào bạn có thể sử dụng enum sau đó? Ví dụ của bạn có đúng không? –

7

Không có trường hợp nào; vẫn còn, enum không phải là một giải pháp tuyệt vời trong mọi trường hợp, chỉ cần sử dụng một bảng tham chiếu.

+6

+1 cho "enum không phải là giải pháp tuyệt vời" –

2

Tôi đã gặp sự cố này và giải quyết vấn đề bằng cách tạo một bảng riêng biệt và ràng buộc khóa ngoài.

CREATE TABLE My_Enum_Table (
    my_column varchar(255) UNIQUE 
); 

INSERT INTO My_Enum_Table (my_column) 
VALUES 
    ('First'), 
    ('Second'), 
    ... 
    ('Last'); 

CREATE TABLE My_Table (
    my_column varchar(255), 
    FOREIGN KEY (my_column) REFERENCES My_Enum_Table (my_column) 
); 

Bằng cách đó khi bạn cố gắng làm một INSERT vào My_Table nó sẽ làm một kiểm tra chính nước ngoài để đảm bảo giá trị mà bạn đang chèn là trong My_Enum_Table.

Có một số thỏa hiệp ở đây mặc dù:

  • PROS
    • Bạn vẫn có thể tương tác với điều này giống như cách bạn sẽ một ENUM.
    • Bạn cũng có thêm chút linh hoạt theo nghĩa là bạn có thể thêm một giá trị khác mà không phải thay đổi định nghĩa bảng.
  • Nhược điểm
    • Điều này có thể chậm hơn so với một ENUM vì nó có để làm một nhìn lên bảng. Mặc dù thực tế, vì bảng nên có một số lượng nhỏ các hàng hợp lý, điều này có lẽ khá không đáng kể. Việc thêm chỉ mục vào My_Table.my_column có thể giúp bạn thực hiện việc này.
    • Điều này ngăn cản sự cần thiết phải tham gia với bảng tham chiếu nhưng về cơ bản cùng mức độ phức tạp từ phối cảnh cơ sở dữ liệu. Mặc dù điều này có lẽ không phải là một vấn đề lớn trừ khi bạn lo lắng về việc làm lộn xộn cơ sở dữ liệu của bạn với một bảng khác.
    • Điều này cũng yêu cầu bạn sử dụng công cụ hỗ trợ khóa ngoài, chẳng hạn như INNODB. Tôi không chắc chắn nếu điều này thực sự là một CON nhưng tôi cho rằng nó có thể được cho một người có nhu cầu chuyên ngành.
1

Hình như H2 có enums: http://www.h2database.com/html/datatypes.html#enum_type

Vì vậy, cú pháp chính xác cùng nên làm việc. (Tôi không biết ngữ nghĩa phù hợp như thế nào.)

+0

Nó hiện có hỗ trợ, [kể từ ** phiên bản 1.4.195 **, phát hành vào ngày 2017-04-23] (http://www.h2database.com/html/changelog.html), nhưng không có khi nào câu hỏi đã được viết. Có lẽ bạn muốn làm rõ trong câu trả lời của bạn. –

Các vấn đề liên quan