MySQL enum veri türüne eşdeğer SQL Server mı?


Yanıtlar:


155

Öyle değil. Belirsiz bir eşdeğeri var:

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

10
Neden geçerli değerleri tanımlayan bir tablo kullanıp daha sonra bunun yerine bir yabancı anahtar kısıtlaması kullanmıyorsunuz?
Elaskanator

@Elaskanator Bunun en doğru şekilde doğrudan OP'yi yanıtladığını söyleyebilirim, ancak bunun için en iyi çözüm muhtemelen FK + harici tablo kullanımıdır.
userfuser

Bana apaçık olanı hatırlattığınız için teşekkür ederim @Elaskanator ... veriyi normalleştirin ve enum'un varlığını durdurun.
Andrew

88

Bunda bulduğum en iyi çözüm, birincil anahtar olarak olası değerlerle bir arama tablosu oluşturmak ve arama tablosuna bir yabancı anahtar oluşturmaktır.


13
Sürdürülebilirlik açısından yukarıda gösterilen kontrol kısıtlamasından daha iyi bir çözüm.
HLGEM

21
Bu, Enums'den daha iyi bir çözümdür - MySQL'de de.
ypercubeᵀᴹ

2
@ypercube Neden MySQL için de daha iyi?
BenR

4
@BenRecord MySQL numaralandırmalarıyla ilgili birkaç sorun var: MySQL'in ENUM Data Type Is Evil'in 8 Nedeni . Kötü olduğuna% 100 katılmıyorum ama bunları kullanırken çok dikkatli olmalısın.
ypercubeᵀᴹ

1
@BenR ayrıca MySQL ile katı olmayan modda doğru bir şekilde hatırlarsam, geçersiz bir numaralandırma NULL olarak eklenebilir. Koşul ne olursa olsun, önceki bir ekibim MySQL enum değerinin değerler listesinde belirtilmediğinde eklenememesi ve başarısız olmamasıyla ilgili sorunlar yaşıyordu . Arama tablosundaki yabancı anahtar kısıtlaması bir hataya neden olabilir. Arama tablosunun MySQL için daha iyi olduğuna katılıyorum.
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...

Performansın önemli olduğu yerlerde, yine de katı değerleri kullanın.


1

SQL Server'da numaralandırmaları uygulamak istediğimde bu ilginç yaklaşımı buldum.

Aşağıdaki bağlantıda belirtilen yaklaşım, tüm veritabanı numaralandırma ihtiyaçlarınızın 2 merkezi tablodan karşılanabileceği düşünüldüğünde oldukça zorlayıcıdır.

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


8
Bu, "bir gerçek (arama) tablosu" olarak bilinen anti-modelin bir varyasyonudur. Uygun yaklaşım, her bir numaralandırma türü için ayrı bir tabloya sahip olmak ve yabancı anahtarlar kullanmaktır (eğer aramaya ihtiyacınız varsa, bu "saf" numaralandırmalar için geçerli olmayabilir).
Branko Dimitrijevic

2
Bağlantılı sayfadaki yorumlar, bu cevabın belirttiğinden çok, her "enum" için ayrı tabloların kullanılması için iyi bir yedekleme sağlar
skia.heliou

4
Çoğu insanın bu tasarımda haklı olarak direnmesi oldukça komik, ancak yazar makalesini "En İyi Uygulama" olarak adlandırıyor.
underscore_d
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.