Я столкнулся с этой проблемой и решил ее, создав отдельную таблицу и ограничение внешнего ключа.
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)
);
Таким образом, когда вы пытаетесь сделать INSERT
в My_Table
, он будет делать чужойпроверка ключа, чтобы убедиться, что вводимое вами значение находится в My_Enum_Table
.
Здесь есть некоторые компромиссы:
- PROS
- Вы можетепо-прежнему взаимодействуя с этим так же, как с
ENUM
. - Вы также получаете немного дополнительной гибкости в том смысле, что вы можете добавить другое значение без необходимости изменять определения таблицы.
- CONS
- Это, вероятно, медленнее, чем
ENUM
, так как он должен искать в таблице.Реально, хотя, так как в таблице должно быть достаточно небольшое количество строк, это, вероятно, довольно незначительно.В этом может помочь добавление индекса к My_Table.my_column
. - Это предотвращает необходимость объединения с справочной таблицей, но в основном с той же степенью сложности с точки зрения базы данных.Хотя это, вероятно, не имеет большого значения, если только вы не беспокоитесь о загромождении своей базы данных другой таблицей.
- Для этого также необходимо использовать механизм, поддерживающий внешние ключи, например
INNODB
.Я не уверен, действительно ли это CON, но я полагаю, что это может быть для кого-то с особыми потребностями.