วิธีบันทึก enums ในฐานข้อมูล


123

วิธีที่ดีที่สุดในการบันทึก enums ลงในฐานข้อมูลคืออะไร?

ฉันรู้ว่า Java จัดเตรียมname()และvalueOf()วิธีการในการแปลงค่า enum เป็นสตริงและย้อนกลับ แต่มีตัวเลือกอื่น ๆ (ยืดหยุ่น) ในการจัดเก็บค่าเหล่านี้หรือไม่?

มีวิธีที่ชาญฉลาดในการทำให้ enum เป็นตัวเลขเฉพาะ ( ordinal()ไม่ปลอดภัยที่จะใช้) หรือไม่?

ปรับปรุง:

ขอบคุณสำหรับคำตอบที่ยอดเยี่ยมและรวดเร็ว! มันเป็นไปตามที่ฉันสงสัย

อย่างไรก็ตามหมายเหตุถึง 'toolkit'; นั่นเป็นวิธีหนึ่ง ปัญหาคือฉันจะต้องเพิ่มเมธอดเดียวกันกับ Enum แต่ละประเภทที่ฉันสร้าง นั่นคือโค้ดที่ซ้ำกันจำนวนมากและในขณะนี้ Java ไม่รองรับโซลูชันใด ๆ สำหรับสิ่งนี้ (Java enum ไม่สามารถขยายคลาสอื่น ๆ ได้)


2
เหตุใดคำสั่ง () จึงไม่ปลอดภัยที่จะใช้?
Michael Myers

ฐานข้อมูลประเภทใด MySQL มีประเภท enum แต่ฉันไม่คิดว่าเป็น ANSI SQL มาตรฐาน
Sherm Pendley

6
เนื่องจากจะต้องมีการเพิ่มการแจงนับใด ๆ ต่อท้าย ง่ายสำหรับนักพัฒนาที่ไม่สงสัยที่จะทำสิ่งนี้และทำให้เกิดความเสียหาย
oxbow_lakes

1
ฉันเห็น. เดาว่าเป็นเรื่องดีที่ฉันไม่ได้จัดการกับฐานข้อมูลมากนักเพราะฉันคงไม่ได้คิดเรื่องนั้นจนกว่ามันจะสายเกินไป
Michael Myers

คำตอบ:


165

เราไม่เคยจัดเก็บการแจงนับเป็นค่าลำดับตัวเลขอีกต่อไป ทำให้การดีบักและการสนับสนุนยากเกินไป เราจัดเก็บค่าการแจงนับจริงที่แปลงเป็นสตริง:

public enum Suit { Spade, Heart, Diamond, Club }

Suit theSuit = Suit.Heart;

szQuery = "INSERT INTO Customers (Name, Suit) " +
          "VALUES ('Ian Boyd', %s)".format(theSuit.name());

แล้วอ่านกลับด้วย:

Suit theSuit = Suit.valueOf(reader["Suit"]);

ปัญหาในอดีตคือการจ้องมองที่ Enterprise Manager และพยายามถอดรหัส:

Name                Suit
==================  ==========
Shelby Jackson      2
Ian Boyd            1

โองการ

Name                Suit
==================  ==========
Shelby Jackson      Diamond
Ian Boyd            Heart

อย่างหลังง่ายกว่ามาก เดิมต้องการรับที่ซอร์สโค้ดและค้นหาค่าตัวเลขที่กำหนดให้กับสมาชิกการแจงนับ

ใช่มันใช้พื้นที่มากกว่า แต่ชื่อสมาชิกการแจงนับสั้นและฮาร์ดไดรฟ์มีราคาถูกและคุ้มค่ากว่ามากที่จะช่วยเหลือเมื่อคุณประสบปัญหา

นอกจากนี้หากคุณใช้ค่าตัวเลขคุณจะผูกติดอยู่กับค่านั้น คุณไม่สามารถแทรกหรือจัดเรียงสมาชิกใหม่ได้โดยไม่ต้องบังคับค่าตัวเลขเก่า ตัวอย่างเช่นการเปลี่ยนการแจงนับชุดสูทเป็น:

public enum Suit { Unknown, Heart, Club, Diamond, Spade }

จะต้องกลายเป็น:

public enum Suit { 
      Unknown = 4,
      Heart = 1,
      Club = 3,
      Diamond = 2,
      Spade = 0 }

เพื่อรักษาค่าตัวเลขเดิมที่เก็บไว้ในฐานข้อมูล

วิธีการจัดเรียงในฐานข้อมูล

คำถามเกิดขึ้น: สมมติว่าฉันต้องการจัดลำดับค่า บางคนอาจต้องการเรียงลำดับตามค่าลำดับของ enum แน่นอนว่าการเรียงไพ่ตามค่าตัวเลขของการแจงนับนั้นไม่มีความหมาย:

SELECT Suit FROM Cards
ORDER BY SuitID; --where SuitID is integer value(4,1,3,2,0)

Suit
------
Spade
Heart
Diamond
Club
Unknown

นั่นไม่ใช่ลำดับที่เราต้องการ - เราต้องการให้เรียงตามลำดับการแจงนับ:

SELECT Suit FROM Cards
ORDER BY CASE SuitID OF
    WHEN 4 THEN 0 --Unknown first
    WHEN 1 THEN 1 --Heart
    WHEN 3 THEN 2 --Club
    WHEN 2 THEN 3 --Diamond
    WHEN 0 THEN 4 --Spade
    ELSE 999 END

งานเดียวกันกับที่จำเป็นหากคุณบันทึกค่าจำนวนเต็มเป็นสิ่งจำเป็นหากคุณบันทึกสตริง:

SELECT Suit FROM Cards
ORDER BY Suit; --where Suit is an enum name

Suit
-------
Club
Diamond
Heart
Spade
Unknown

แต่นั่นไม่ใช่ลำดับที่เราต้องการ - เราต้องการให้เรียงตามลำดับการแจงนับ:

SELECT Suit FROM Cards
ORDER BY CASE Suit OF
    WHEN 'Unknown' THEN 0
    WHEN 'Heart'   THEN 1
    WHEN 'Club'    THEN 2
    WHEN 'Diamond' THEN 3
    WHEN 'Space'   THEN 4
    ELSE 999 END

ความคิดเห็นของฉันคือการจัดอันดับประเภทนี้อยู่ในอินเทอร์เฟซผู้ใช้ หากคุณกำลังจัดเรียงรายการตามค่าการแจงนับแสดงว่าคุณกำลังทำอะไรผิดพลาด

แต่ถ้าคุณอยากทำจริงๆฉันจะสร้างSuitsตารางมิติ:

| Suit       | SuitID       | Rank          | Color  |
|------------|--------------|---------------|--------|
| Unknown    | 4            | 0             | NULL   |
| Heart      | 1            | 1             | Red    |
| Club       | 3            | 2             | Black  |
| Diamond    | 2            | 3             | Red    |
| Spade      | 0            | 4             | Black  |

ด้วยวิธีนี้เมื่อคุณต้องการเปลี่ยนการ์ดของคุณไปใช้Kissing Kings New Deck Orderคุณสามารถเปลี่ยนการ์ดเพื่อการแสดงผลโดยไม่ต้องทิ้งข้อมูลทั้งหมดของคุณ:

| Suit       | SuitID       | Rank          | Color  | CardOrder |
|------------|--------------|---------------|--------|-----------|
| Unknown    | 4            | 0             | NULL   | NULL      |
| Spade      | 0            | 1             | Black  | 1         |
| Diamond    | 2            | 2             | Red    | 1         |
| Club       | 3            | 3             | Black  | -1        |
| Heart      | 1            | 4             | Red    | -1        |

ตอนนี้เรากำลังแยกรายละเอียดการเขียนโปรแกรมภายใน (ชื่อการแจงนับค่าการนับ) ด้วยการตั้งค่าการแสดงผลสำหรับผู้ใช้:

SELECT Cards.Suit 
FROM Cards
   INNER JOIN Suits ON Cards.Suit = Suits.Suit
ORDER BY Suits.Rank, 
   Card.Rank*Suits.CardOrder

23
toString มักจะถูกเขียนทับเพื่อให้แสดงค่า ชื่อ () เป็นทางเลือกที่ดีกว่าเนื่องจากเป็นไปตามความหมายของคู่ของ valueOf ()
ddimitrov

9
ฉันไม่เห็นด้วยอย่างยิ่งกับสิ่งนี้หากจำเป็นต้องมีการคงอยู่อย่างต่อเนื่องไม่ควรยืนยันชื่อ เท่าที่อ่านย้อนกลับไปมันง่ายกว่าด้วย value แทนชื่อสามารถพิมพ์เป็น SomeEnum enum1 = (SomeEnum) 2;
mamu

3
mamu: จะเกิดอะไรขึ้นเมื่อการเทียบเท่าตัวเลขเปลี่ยนไป?
Ian Boyd

2
ฉันจะกีดกันทุกคนที่ใช้แนวทางนี้ การผูกตัวเองกับการแสดงสตริงจำกัดความยืดหยุ่นของโค้ดและการปรับโครงสร้างใหม่ คุณควรใช้รหัสเฉพาะจะดีกว่า การจัดเก็บสตริงยังทำให้เปลืองพื้นที่จัดเก็บอีกด้วย
Tautvydas

2
@LuisGouveia ฉันเห็นด้วยกับคุณว่าเวลาอาจเพิ่มขึ้นเป็นสองเท่า ที่ก่อให้เกิดแบบสอบถามที่ใช้แทนที่จะใช้12.37 ms 12.3702 msนั่นคือสิ่งที่ผมหมายถึง"ในเสียง" คุณรันการสอบถามอีกครั้งและจะใช้เวลาหรือ13.29 ms 11.36 msกล่าวอีกนัยหนึ่งความสุ่มของตัวกำหนดตารางเวลาเธรดจะทำให้การเพิ่มประสิทธิภาพขนาดเล็กที่คุณมีในทางทฤษฎีล้นอย่างมากซึ่งในทางทฤษฎีไม่มีใครมองเห็นได้เลย
Ian Boyd

42

เว้นแต่คุณจะมีเหตุผลด้านประสิทธิภาพที่เฉพาะเจาะจงที่ควรหลีกเลี่ยงฉันขอแนะนำให้ใช้ตารางแยกต่างหากสำหรับการแจงนับ ใช้ความสมบูรณ์ของคีย์ต่างประเทศเว้นแต่การค้นหาเพิ่มเติมจะฆ่าคุณจริงๆ

ชุดโต๊ะ:

suit_id suit_name
1       Clubs
2       Hearts
3       Spades
4       Diamonds

โต๊ะผู้เล่น

player_name suit_id
Ian Boyd           4
Shelby Lake        2
  1. หากคุณเคยปรับเปลี่ยนการแจงนับของคุณให้เป็นคลาสที่มีพฤติกรรม (เช่นลำดับความสำคัญ) แสดงว่าฐานข้อมูลของคุณสร้างโมเดลได้อย่างถูกต้องแล้ว
  2. DBA ของคุณมีความสุขเพราะสคีมาของคุณถูกทำให้เป็นมาตรฐาน (จัดเก็บจำนวนเต็มเดียวต่อผู้เล่นแทนที่จะเป็นสตริงทั้งหมดซึ่งอาจพิมพ์ผิดหรือไม่ก็ได้)
  3. ค่าฐานข้อมูลของคุณ ( suit_id) ไม่ขึ้นอยู่กับค่าการแจงนับของคุณซึ่งช่วยให้คุณทำงานกับข้อมูลจากภาษาอื่นได้เช่นกัน

14
แม้ว่าฉันจะยอมรับว่าเป็นเรื่องดีที่จะทำให้เป็นมาตรฐานและมีข้อ จำกัด ในฐานข้อมูล แต่สิ่งนี้ทำให้เกิดการอัปเดตในสองที่เพื่อเพิ่มค่าใหม่ (รหัสและฐานข้อมูล) ซึ่งอาจทำให้เกิดค่าใช้จ่ายมากขึ้น นอกจากนี้ข้อผิดพลาดในการสะกดไม่ควรมีอยู่จริงหากการอัปเดตทั้งหมดเสร็จสิ้นโดยใช้โปรแกรมจากชื่อ Enum
เจสัน

3
ฉันเห็นด้วยกับความคิดเห็นด้านบน กลไกการบังคับใช้ทางเลือกในระดับฐานข้อมูลคือการเขียนทริกเกอร์ข้อ จำกัด ซึ่งจะปฏิเสธการแทรกหรือการอัปเดตที่พยายามใช้ค่าที่ไม่ถูกต้อง
สตีฟเพอร์กินส์

1
เหตุใดฉันจึงต้องการประกาศข้อมูลเดียวกันในสองที่ ทั้งใน CODE public enum foo {bar}และCREATE TABLE foo (name varchar);ที่สามารถซิงค์ได้อย่างง่ายดาย
ebyrob

หากเราใช้คำตอบที่ยอมรับตามมูลค่านั่นคือชื่อ enum ใช้สำหรับการตรวจสอบด้วยตนเองเท่านั้นคำตอบนี้เป็นตัวเลือกที่ดีที่สุด นอกจากนี้หากคุณเปลี่ยนลำดับการแจงนับหรือค่าหรือชื่อคุณจะมีปัญหามากกว่าการดูแลตารางพิเศษนี้เสมอ โดยเฉพาะอย่างยิ่งเมื่อคุณต้องการเพียง (และอาจเลือกสร้างเพียงชั่วคราว) สำหรับการดีบักและการสนับสนุน
afk5min

5

ฉันจะเถียงว่ากลไกที่ปลอดภัยเพียงอย่างเดียวคือการใช้name()ค่าString เมื่อเขียนถึงฐานข้อมูลคุณสามารถใช้ sproc เพื่อแทรกค่าและเมื่ออ่านให้ใช้ View ในลักษณะนี้หาก enums เปลี่ยนไปจะมีระดับของการเหนี่ยวนำใน sproc / view เพื่อให้สามารถนำเสนอข้อมูลเป็นค่า enum โดยไม่ต้อง "กำหนด" สิ่งนี้บน DB


1
ฉันใช้วิธีการแก้ปัญหาแบบผสมผสานของคุณและโซลูชันของ @Ian Boyd ประสบความสำเร็จอย่างมาก ขอบคุณสำหรับทิป!
technomalogical

5

อย่างที่คุณพูดคำสั่งมีความเสี่ยงเล็กน้อย พิจารณาตัวอย่าง:

public enum Boolean {
    TRUE, FALSE
}

public class BooleanTest {
    @Test
    public void testEnum() {
        assertEquals(0, Boolean.TRUE.ordinal());
        assertEquals(1, Boolean.FALSE.ordinal());
    }
}

หากคุณจัดเก็บสิ่งนี้เป็นลำดับคุณอาจมีแถวเช่น:

> SELECT STATEMENT, TRUTH FROM CALL_MY_BLUFF

"Alice is a boy"      1
"Graham is a boy"     0

แต่จะเกิดอะไรขึ้นถ้าคุณอัปเดตบูลีน

public enum Boolean {
    TRUE, FILE_NOT_FOUND, FALSE
}

ซึ่งหมายความว่าคำโกหกทั้งหมดของคุณจะถูกตีความผิดว่า 'file-not-found'

ดีกว่าแค่ใช้การแสดงสตริง


4

สำหรับฐานข้อมูลขนาดใหญ่ฉันไม่เต็มใจที่จะสูญเสียข้อได้เปรียบด้านขนาดและความเร็วของการแสดงตัวเลข ฉันมักจะลงท้ายด้วยตารางฐานข้อมูลที่แสดงถึง Enum

คุณสามารถบังคับใช้ความสอดคล้องของฐานข้อมูลได้โดยการประกาศคีย์ต่างประเทศ - แม้ว่าในบางกรณีอาจเป็นการดีกว่าที่จะไม่ประกาศว่าเป็นข้อ จำกัด ของคีย์ต่างประเทศซึ่งกำหนดค่าใช้จ่ายในทุกธุรกรรม คุณสามารถตรวจสอบความสอดคล้องกันได้โดยทำการตรวจสอบเป็นระยะ ๆ ในช่วงเวลาที่คุณเลือกด้วย:

SELECT reftable.* FROM reftable
  LEFT JOIN enumtable ON reftable.enum_ref_id = enumtable.enum_id
WHERE enumtable.enum_id IS NULL;

อีกครึ่งหนึ่งของโซลูชันนี้คือการเขียนโค้ดทดสอบที่ตรวจสอบว่า Java enum และตาราง enum ของฐานข้อมูลมีเนื้อหาเหมือนกัน ที่เหลือเป็นแบบฝึกหัดสำหรับผู้อ่าน


1
สมมติว่าความยาวของชื่อการแจงนับเฉลี่ยคือ 7 อักขระ ของคุณenumIDคือสี่ไบต์ดังนั้นคุณจึงมีอีกสามไบต์ต่อแถวโดยใช้ชื่อ 3 ไบต์ x 1 ล้านแถวคือ 3MB
Ian Boyd

@IanBoyd: แต่enumIdพอดีกับสองไบต์อย่างแน่นอน (enums อีกต่อไปไม่สามารถทำได้ใน Java) และส่วนใหญ่พอดีในไบต์เดียว (ซึ่ง DB บางตัวรองรับ) พื้นที่ที่บันทึกไว้มีความสำคัญเล็กน้อย แต่การเปรียบเทียบที่เร็วขึ้นและความยาวคงที่จะช่วยได้
maaartinus

3

เราแค่เก็บชื่อ enum ไว้ - มันอ่านง่ายกว่า

เรายุ่งเกี่ยวกับการจัดเก็บค่าเฉพาะสำหรับ enums ซึ่งมีชุดค่าที่ จำกัด เช่น enum นี้ที่มีชุดสถานะที่ จำกัด ซึ่งเราใช้ char เพื่อแสดง (มีความหมายมากกว่าค่าตัวเลข):

public enum EmailStatus {
    EMAIL_NEW('N'), EMAIL_SENT('S'), EMAIL_FAILED('F'), EMAIL_SKIPPED('K'), UNDEFINED('-');

    private char dbChar = '-';

    EmailStatus(char statusChar) {
        this.dbChar = statusChar;
    }

    public char statusChar() {
        return dbChar;
    }

    public static EmailStatus getFromStatusChar(char statusChar) {
        switch (statusChar) {
        case 'N':
            return EMAIL_NEW;
        case 'S':
            return EMAIL_SENT;
        case 'F':
            return EMAIL_FAILED;
        case 'K':
            return EMAIL_SKIPPED;
        default:
            return UNDEFINED;
        }
    }
}

และเมื่อคุณมีค่ามากคุณต้องมี Map ภายใน enum เพื่อให้เมธอด getFromXYZ นั้นมีขนาดเล็ก


หากคุณไม่ต้องการรักษาคำสั่ง switch และมั่นใจได้ว่า dbChar ไม่ซ้ำกันคุณสามารถใช้สิ่งต่างๆเช่น: EmailStatus แบบคงที่สาธารณะ getFromStatusChar (ถ่าน statusChar) {return Arrays.stream (EmailStatus.values ​​()) .filter (e -> e.statusChar () == statusChar) .findFirst () .orElse (UNDEFINED); }
Kuchi

2

หากบันทึก enums เป็นสตริงในฐานข้อมูลคุณสามารถสร้างวิธีการยูทิลิตี้เพื่อ (de) ทำให้อนุกรม enum ใด ๆ :

   public static String getSerializedForm(Enum<?> enumVal) {
        String name = enumVal.name();
        // possibly quote value?
        return name;
    }

    public static <E extends Enum<E>> E deserialize(Class<E> enumType, String dbVal) {
        // possibly handle unknown values, below throws IllegalArgEx
        return Enum.valueOf(enumType, dbVal.trim());
    }

    // Sample use:
    String dbVal = getSerializedForm(Suit.SPADE);
    // save dbVal to db in larger insert/update ...
    Suit suit = deserialize(Suit.class, dbVal);

ยินดีที่จะใช้สิ่งนี้กับค่า enum เริ่มต้นเพื่อถอยกลับใน deserialize ตัวอย่างเช่นจับ IllegalArgEx และส่งคืน Suit.None
Jason

2

ประสบการณ์ทั้งหมดของฉันบอกฉันว่าวิธีที่ปลอดภัยที่สุดในการคงอยู่ทุกที่คือการใช้ค่ารหัสเพิ่มเติมหรือรหัส (วิวัฒนาการบางอย่างของคำตอบ @jeebee) นี่อาจเป็นตัวอย่างไอเดียที่ดี:

enum Race {
    HUMAN ("human"),
    ELF ("elf"),
    DWARF ("dwarf");

    private final String code;

    private Race(String code) {
        this.code = code;
    }

    public String getCode() {
        return code;
    }
}

ตอนนี้คุณสามารถไปกับการคงอยู่ที่อ้างถึงค่าคงที่ enum ของคุณด้วยรหัส แม้ว่าคุณจะตัดสินใจที่จะเปลี่ยนบางส่วนของชื่อคงคุณสามารถบันทึกค่ารหัส (เช่นDWARF("dwarf")การGNOME("dwarf") )

โอเคดำดิ่งลึกลงไปอีกกับแนวคิดนี้ นี่คือวิธียูทิลิตี้บางส่วนที่ช่วยคุณค้นหาค่า enum ใด ๆ แต่ก่อนอื่นให้ขยายแนวทางของเรา

interface CodeValue {
    String getCode();
}

และปล่อยให้ enum ของเรานำไปใช้:

enum Race implement CodeValue {...}

นี่เป็นเวลาสำหรับวิธีการค้นหาเวทมนตร์:

static <T extends Enum & CodeValue> T resolveByCode(Class<T> enumClass, String code) {
    T[] enumConstants = enumClass.getEnumConstants();
    for (T entry : enumConstants) {
        if (entry.getCode().equals(code)) return entry;
    }
    // In case we failed to find it, return null.
    // I'd recommend you make some log record here to get notified about wrong logic, perhaps.
    return null;
}

และใช้มันอย่างมีเสน่ห์: Race race = resolveByCode(Race.class, "elf")


2

ฉันประสบปัญหาเดียวกันกับที่วัตถุประสงค์ของฉันคือการคงค่า Enum String ไว้ในฐานข้อมูลแทนค่าลำดับ

เมื่อมาถึงปัญหานี้ฉันได้ใช้@Enumerated(EnumType.STRING)และวัตถุประสงค์ของฉันได้รับการแก้ไขแล้ว

ตัวอย่างเช่นคุณมีEnumคลาส:

public enum FurthitMethod {

    Apple,
    Orange,
    Lemon
}

ในคลาสเอนทิตีกำหนด@Enumerated(EnumType.STRING):

@Enumerated(EnumType.STRING)
@Column(name = "Fruits")
public FurthitMethod getFuritMethod() {
    return fruitMethod;
}

public void setFruitMethod(FurthitMethod authenticationMethod) {
    this.fruitMethod= fruitMethod;
}

ในขณะที่คุณพยายามตั้งค่าของคุณเป็นฐานข้อมูลค่า String จะยังคงอยู่ในฐานข้อมูลเป็น " APPLE", " ORANGE" หรือ " LEMON"


1

หลายค่าที่มีความสัมพันธ์หรือสำหรับหนึ่งฟิลด์ enum แนวคิดสำหรับ. NET ที่มีการจัดเก็บประเภท enum ในฐานข้อมูลเช่นไบต์หรือ int และใช้ FlagsAttribute ในโค้ดของคุณ

http://blogs.msdn.com/b/efdesign/archive/2011/06/29/enumeration-support-in-entity-framework.aspx


0

คุณสามารถใช้ค่าพิเศษในค่าคงที่ enum ที่สามารถอยู่ได้ทั้งการเปลี่ยนชื่อและการใช้ enum:

public enum MyEnum {
    MyFirstValue(10),
    MyFirstAndAHalfValue(15),
    MySecondValue(20);

    public int getId() {
        return id;
    }
    public static MyEnum of(int id) {
        for (MyEnum e : values()) {
            if (id == e.id) {
                return e;
            }
        }
        return null;
    }
    MyEnum(int id) {
        this.id = id;
    }
    private final int id;
}

ในการรับรหัสจาก enum:

int id = MyFirstValue.getId();

ในการรับ enum จาก id:

MyEnum e = MyEnum.of(id);

ฉันขอแนะนำให้ใช้ค่าที่ไม่มีความหมายเพื่อหลีกเลี่ยงความสับสนหากต้องเปลี่ยนชื่อ enum

ในตัวอย่างข้างต้นฉันได้ใช้ "การกำหนดหมายเลขแถวพื้นฐาน" ตัวแปรบางตัวโดยเว้นช่องว่างดังนั้นตัวเลขจะอยู่ในลำดับเดียวกับ enums

เวอร์ชันนี้เร็วกว่าการใช้ตารางรอง แต่ทำให้ระบบขึ้นอยู่กับความรู้เกี่ยวกับโค้ดและซอร์สโค้ด

หากต้องการแก้ไขคุณสามารถตั้งค่าตารางที่มีรหัส enum ในฐานข้อมูลได้เช่นกัน หรือไปทางอื่นแล้วเลือกรหัสสำหรับ enums จากตารางในขณะที่คุณเพิ่มแถวเข้าไป

Sidenote : ตรวจสอบเสมอว่าคุณไม่ได้ออกแบบสิ่งที่ควรเก็บไว้ในตารางฐานข้อมูลและดูแลให้เป็นวัตถุปกติ หากคุณนึกภาพออกว่าคุณต้องเพิ่มค่าคงที่ใหม่ให้กับ enum ณ จุดนี้เมื่อคุณตั้งค่านั่นเป็นข้อบ่งชี้ว่าคุณควรสร้างวัตถุปกติและตารางแทน

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.