我可以使用VARCHAR作为PRIMARY KEY吗?

Mik*_*ady 48 mysql sql varchar unique primary-key

我有一个存储优惠券/折扣的表,我想使用coupon_code列作为主键,这是一个VARCHAR.

我的理由是,每个优惠券都有一个唯一的代码,我将运行的唯一命令是 SELECT ... FROM ... WHERE coupon_code='..'

我不会进行任何连接或索引,并且我没有看到此表中有超过几百个条目.

在我看来,这将是好的,但我不知道是否有任何我缺少/没有考虑的事情.

das*_*ght 102

当然,你可以在RDBMS允许你这样做的意义上.这个问题的答案,你是否没有问题应该做到这一点是不同的,虽然:在大多数情况下,有你的数据库系统之外的含义值应该被选择为一个主键.

如果您知道在建模的系统中该值是唯一的,则为表添加唯一索引或唯一约束是合适的.但是,您的主键通常应该是一些"无意义"的值,例如自动递增的数字或GUID.

这个的基本原理很简单:数据输入错误和看似不可更改的事情的偶发变化确实发生.它们变得更难以修复用作主键的值.

  • @terary您将数据唯一标识为用户与数据库唯一标识数据的方式之间存在差异.将SSN放在不是主键的唯一字段中是完全正常的.这可以让您在输入系统后更改SSN,例如,因为您发现了数据输入错误. (3认同)
  • 这里的观点是错误的。我认为,在许多情况下,拥有有意义的主键或复合主键是有利的。 (3认同)

Jos*_*osh 18

一条毯子"不,你不应该"是一个糟糕的建议.根据您的使用案例,工作负载,数据熵,硬件等,这在很多情况下都是完全合理的.您不应该做的是做出假设.

应该注意的是,您可以指定一个限制MySQL索引的前缀,从而在扫描其余部分之前为您提供一些缩小结果的帮助.然而,随着时间的推移,这可能会变得不那么有用,因为您的前缀"填满"并变得不那么独特.

这很简单,例如:

CREATE TABLE IF NOT EXISTS `foo` (
  `id` varchar(128),
  PRIMARY KEY (`id`(4)),
)
Run Code Online (Sandbox Code Playgroud)

另请注意,前缀(4)出现列引号之后.

最后,您应该在使用它们之前阅读索引前缀如何工作及其限制:

http://dev.mysql.com/doc/refman/5.0/en/create-index.html