SQL Server equivalente ao tipo de dados enum do MySQL?

Respostas:

155

Não faz. Há um equivalente vago:

mycol VARCHAR(10) NOT NULL CHECK (mycol IN('Useful', 'Useless', 'Unknown'))
caos
fonte
10
Por que não usar uma tabela que define valores válidos e depois usar uma restrição de chave estrangeira?
Elaskanator
@ Elaskanator, eu diria que isso responde com mais precisão ao OP direto, enquanto a melhor solução para isso é provavelmente o uso da tabela externa FK +.
Userfuser
Obrigado @Elaskanator por me lembrar do óbvio ... normalize os dados e a enumeração deixa de existir.
Andrew Andrew
88

A melhor solução que encontrei aqui é criar uma tabela de pesquisa com os valores possíveis como chave primária e criar uma chave estrangeira para a tabela de pesquisa.

user1431422
fonte
13
Uma solução melhor do ponto de vista de manutenção do que a restrição de verificação mostrada acima.
HLGEM
21
Esta é uma solução melhor que a Enums - também no MySQL.
ypercubeᵀᴹ
2
@ypercube Por que também é melhor para o MySQL?
BenR
4
@BenRecord Existem vários problemas com as enumerações do MySQL: 8 razões pelas quais o tipo de dados ENUM do MySQL é mau . Eu não concordo 100% que é mau, mas você deve ter cuidado extra ao usá-los.
ypercubeᵀᴹ
1
@ BenR também, se bem me lembro, no modo não-estrito com MySQL, uma enum inválida pode ser inserida como um NULL. Qualquer que seja a condição, uma equipe anterior teve problemas com uma enum do MySQL ao não ser inserida e não falhar quando o valor não foi especificado na lista de valores. Uma restrição de chave estrangeira em uma tabela de pesquisa causaria uma falha. Concordo que a tabela de pesquisa é melhor para o MySQL.
21815 Jim Schubert
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...

Onde o desempenho importa, ainda use os valores concretos.

Dimitrios Staikos
fonte
1

Encontrei essa abordagem interessante quando quis implementar enumerações no SQL Server.

A abordagem mencionada abaixo no link é bastante convincente, considerando que todas as suas necessidades de enum de banco de dados podem ser satisfeitas com 2 tabelas centrais.

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

user_v
fonte
8
Essa é uma variação do antipadrão conhecido como "uma tabela verdadeira (consulta)". A abordagem adequada é ter uma tabela separada para cada tipo de enumeração e usar chaves estrangeiras (se você precisar procurar, o que pode não ser o caso de enumerações "puras").
Branko Dimitrijevic
2
Os comentários sobre a página vinculada prestar um bom backup para o uso de tabelas individuais para cada "enumeração", ao invés do que esta resposta especifica
skia.heliou
4
É bem engraçado como a maioria das pessoas se recusaria com esse design, mas o autor nomeia o artigo "Prática recomendada".
Sublinhado_d