SQL Server еквівалентний типі даних MySQL enum?


Відповіді:


155

Це не так. Є невиразний еквівалент:

mycol VARCHAR(10) NOT NULL CHECK (mycol IN('Useful', 'Useless', 'Unknown'))

10
Чому б не використовувати таблицю, яка визначає дійсні значення, а потім замість цього використати обмеження для зовнішнього ключа?
Еласканатор

@Elaskanator Я б сказав, що це найбільш точно відповідає прямим ОП, тоді як найкращим рішенням для нього є, мабуть, використання зовнішнього столу FK +.
userfuser

Дякую @Elaskanator, що нагадав мені про очевидне ... нормалізація даних і зупинка переживань.
Андрій

88

Найкраще рішення, яке я знайшов у цьому, - створити таблицю пошуку з можливими значеннями в якості первинного ключа та створити зовнішній ключ до таблиці пошуку.


13
Краще рішення з точки зору ремонтопридатності, ніж обмеження перевірки, показане вище.
HLGEM

21
Це краще рішення, ніж Enums - і в MySQL.
ypercubeᵀᴹ

2
@ypercube Чому краще для MySQL?
БенР

4
@BenRecord Існує кілька проблем із перерахунками MySQL: 8 причин, чому тип даних ENUM MySQL є злим . Я не згоден на 100%, що це зло, але ви повинні бути особливо обережними, коли користуєтесь ними.
ypercubeᵀᴹ

1
@BenR також якщо я правильно пригадую, в не строгому режимі з MySQL недійсний перерахунок може бути вставлений як NULL. Незалежно від умови, попередня моя команда мала проблеми з тим, що перерахунок MySQL не вставлявся та не вийшов із ладу, коли значення не було вказано у списку значень. Обмеження зовнішнього ключа в таблиці пошуку може призвести до помилки. Я погоджуюся, що таблиця пошуку краще для MySQL.
Джим Шуберт


2
CREATE FUNCTION ActionState_Preassigned()
RETURNS tinyint
AS
BEGIN
    RETURN 0
END

GO

CREATE FUNCTION ActionState_Unassigned()
RETURNS tinyint
AS
BEGIN
    RETURN 1
END

-- etc...

Якщо продуктивність важлива, все-таки використовуйте жорсткі значення.


1

Знайшов цей цікавий підхід, коли я хотів реалізувати перерахунки в SQL Server.

Підхід, згаданий нижче у посиланні, є досить переконливим, враховуючи, що всі потреби вашої бази даних можуть бути задоволені двома центральними таблицями.

http://blog.sqlauthority.com/2010/03/22/sql-server-enumerations-in-relational-database-best-practice/


8
Це зміна антидіаграми, відомої як "одна справжня таблиця пошуку". Правильний підхід полягає в тому, щоб мати окрему таблицю для кожного типу перерахунків і використовувати зовнішні ключі (якщо вам взагалі потрібен пошук, що може не стосуватися "чистих" перерахунків).
Бранко Димитріевич

2
Коментарі на пов'язаній сторінці дають гарну резервну копію для використання окремих таблиць для кожного "перерахунку", а не те, що зазначена у цій відповіді
skia.heliou

4
Дуже смішно, як більшість людей справедливо блукають над цим дизайном, але автор називає свою статтю "Найкраща практика".
підкреслюй_
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.