ПРИХОДИТЕ УЧИТЬСЯ НОВОЙ ПРОФЕССИИ ЛЕТОМ СО СКИДКОЙ ДО 70%Забронировать скидку

Эквивалент типа данных MySQL Enum в SQL Server 2008

Пройдите тест, узнайте какой профессии подходите и получите бесплатную карьерную консультацию
В конце подарим скидку до 55% на обучение
Я предпочитаю
0%
Работать самостоятельно и не зависеть от других
Работать в команде и рассчитывать на помощь коллег
Организовывать и контролировать процесс работы

Быстрый ответ

SQL Server не предлагает встроенный тип данных ENUM, однако существует способ его реализовать. Введение справочной таблицы с ограниченными значениями и внешнего ключа в таблице, которая должна использовать данный тип, позволит ограничить значения столбца установленным набором.

Пример кода:

SQL
Скопировать код
-- Создаем таблицу для допустимых значений
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.

Пройдите тест и узнайте подходит ли вам сфера IT
Пройти тест

Имитация ENUM с помощью ограничения CHECK

Для более простых случаев можно применить ограничение CHECK, вмещающее все возможные значения непосредственно в определение столбца, что позволяет обойтись без создания отдельной таблицы.

Пример кода:

SQL
Скопировать код
-- Создание основной таблицы с ограничением 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, повышая безопасность типов.

Визуализация

Markdown
Скопировать код
MySQL Tools (🧰): Обладает инструментом "ENUM" 🔧

SQL Server Tools (🧳): Не имеет "ENUM" 🔧, взамен предлагает "CHECK CONSTRAINT" 📏 и "LOOKUP TABLE" 🗄️

SQL Server выступает в роли мастера, который осуществляет обходные мане,ры:

Markdown
Скопировать код
Мастер (👷‍♂️) с "CHECK CONSTRAINT" 📏:
- Определяет допустимые значения

Мастер (👷‍♂️) с "LOOKUP TABLE" 🗄️:
- Размещает значения в отдельной секции

Ожидаемый результат при использовании любого из способов:

Markdown
Скопировать код
Стремимся к: Ясно определенному набору варантов для столбца [🔵, 🔴, 🔶]

Используя инструментарий SQL Server, можно имитировать функционал ENUM из MySQL. 🛠️✨

Расширенная имитация типа ENUM

Для сложных систем, которые требуют более тонкого управления перечислениями и дополнительных метаданных, можно использовать следующие подходы.

Создание связанных справочных таблиц

SQL
Скопировать код
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);

Этот подход обеспечивает дополнительную информацию для каждого значения, как, например, описание или рекомендации по применению.

Создание динамических функций для перечислений

SQL
Скопировать код
CREATE FUNCTION dbo.GetColors()
RETURNS TABLE
AS
RETURN (
    SELECT Color
    FROM (VALUES ('Red'), ('Green'), ('Blue')) AS ColorSet(Color)
);

Функции предоставляют гибкость обращения к значениям ENUM, при этом не влияя на структуру базы данных и производительность.

Полезные материалы

  1. Возможно ли переименовать значения в MySQL ENUM одним запросом?
  2. Таблицы в SQL Server без кластерных индексов
  3. Создание ограничения CHECK в Transact-SQL
  4. Имитация типа данных ENUM в SQL Server