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