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
不是免費的。)