Эквивалент типа данных MySQL Enum в SQL Server 2008
Быстрый ответ
SQL Server не предлагает встроенный тип данных ENUM
, однако существует способ его реализовать. Введение справочной таблицы с ограниченными значениями и внешнего ключа в таблице, которая должна использовать данный тип, позволит ограничить значения столбца установленным набором.
Пример кода:
-- Создаем таблицу для допустимых значений
CREATE TABLE ColorEnum (Color VARCHAR(20) PRIMARY KEY);
-- Добавляем данные в таблицу
INSERT INTO ColorEnum (Color) VALUES ('Red'), ('Green'), ('Blue');
-- Создаем основную таблицу с ссылкой на справочник 'Color'
CREATE TABLE Products (
ProductID INT PRIMARY KEY,
Color VARCHAR(20),
CONSTRAINT FK_ColorEnum FOREIGN KEY (Color) REFERENCES ColorEnum(Color)
);
Такая структура позволяет обеспечивает соответствие значений в столбце Products.Color
тем, что заданы в ColorEnum
, функционально повторяя поведение ENUM
.
Имитация ENUM с помощью ограничения CHECK
Для более простых случаев можно применить ограничение CHECK
, вмещающее все возможные значения непосредственно в определение столбца, что позволяет обойтись без создания отдельной таблицы.
Пример кода:
-- Создание основной таблицы с ограничением CHECK для 'Color'
CREATE TABLE Products (
ProductID INT PRIMARY KEY,
Color VARCHAR(20) NOT NULL CHECK (Color IN ('Red', 'Green', 'Blue'))
);
Ограничения CHECK
гарантируют целостность данных, определяя допустимые значения на уровне определения таблицы.
Практическое применение ENUM-подобных структур
При определении подхода к моделированию структур, аналогичных ENUM
, следует учитывать следующее:
- Производительность: В работе ограничений
CHECK
отсутствуют соединения, что обычно ускоряет их работу. - Обслуживание: Вспомогательные таблицы упрощают обновление допустимых значений без необходимости изменять структуру основной таблицы.
- Целостность данных: Таблицы с внешними ключами обеспечивают надежное соблюдение ограничений данных, в отличие от ограничений
CHECK
. - Интеграция: Справочные таблицы можно использовать для автоматического генерирования
ENUM
кода в.NET
с помощью шаблонов T4, повышая безопасность типов.
Визуализация
MySQL Tools (🧰): Обладает инструментом "ENUM" 🔧
SQL Server Tools (🧳): Не имеет "ENUM" 🔧, взамен предлагает "CHECK CONSTRAINT" 📏 и "LOOKUP TABLE" 🗄️
SQL Server выступает в роли мастера, который осуществляет обходные мане,ры:
Мастер (👷♂️) с "CHECK CONSTRAINT" 📏:
- Определяет допустимые значения
Мастер (👷♂️) с "LOOKUP TABLE" 🗄️:
- Размещает значения в отдельной секции
Ожидаемый результат при использовании любого из способов:
Стремимся к: Ясно определенному набору варантов для столбца [🔵, 🔴, 🔶]
Используя инструментарий SQL Server, можно имитировать функционал ENUM
из MySQL. 🛠️✨
Расширенная имитация типа ENUM
Для сложных систем, которые требуют более тонкого управления перечислениями и дополнительных метаданных, можно использовать следующие подходы.
Создание связанных справочных таблиц
CREATE TABLE ColorEnum (
ColorID INT PRIMARY KEY,
ColorName VARCHAR(15) NOT NULL,
Description VARCHAR(255)
);
ALTER TABLE Products
ADD ColorID INT,
CONSTRAINT FK_ColorEnum FOREIGN KEY (ColorID) REFERENCES ColorEnum(ColorID);
Этот подход обеспечивает дополнительную информацию для каждого значения, как, например, описание или рекомендации по применению.
Создание динамических функций для перечислений
CREATE FUNCTION dbo.GetColors()
RETURNS TABLE
AS
RETURN (
SELECT Color
FROM (VALUES ('Red'), ('Green'), ('Blue')) AS ColorSet(Color)
);
Функции предоставляют гибкость обращения к значениям ENUM
, при этом не влияя на структуру базы данных и производительность.