TINYINT 作為替代品

假設我們有

type ENUM('fish','mammal','bird')

另一種選擇是

type TINYINT UNSIGNED

CREATE TABLE AnimalTypes (
    type TINYINT UNSIGNED NOT NULL AUTO_INCREMENT,
    name VARCHAR(20) NOT NULL  COMMENT "('fish','mammal','bird')",
    PRIMARY KEY(type),
    INDEX(name)
) ENGINE=InnoDB

這非常像一張多對多的桌子。

比較,無論是好於還是差於 ENUM:

  • (更糟)INSERT:需要查詢 type
  • (更糟)SELECT:需要 JOIN 來獲取字串(ENUM 不費力地為你提供字串)
  • (更好)新增新型別:只需插入此表即可。使用 ENUM,你需要執行 ALTER TABLE。
  • (相同)這兩種技術(最多 255 個值)只需 1 個位元組。
  • (混合)還存在資料完整性問題:TINYINT 將允許無效值; 而 ENUM 將它們設定為一個特殊的空字串值(除非啟用了嚴格的 SQL 模式,在這種情況下它們被拒絕)。使用 TINYINT 可以實現更好的資料完整性,方法是將其作為查詢表中的外來鍵:通過適當的查詢/連線,但是到達另一個表的成本仍然很低。 (FOREIGN KEYs 不是免費的。)