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

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

我不会做任何连接或索引,我也不认为这个表中有超过几百个条目.

在我看来,这一切都会好起来,但我不知道我是否遗漏了什么/没有考虑什么.

推荐答案

当然可以,因为您的RDBMS将允许您这样做.不过,对于是否执行这一操作的问题,答案是不同的:在大多数情况下,应该 Select 在数据库系统之外有意义的值作为主键.

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

这样做的理由很简单:数据输入错误和看似不可更改的事情的不频繁更改确实会发生.它们的主键变得更难修复.

Mysql相关问答推荐

—符号在哪里条件""

配置MySQL服务器以管理数千个表

用于将重复行的唯一列值作为单独列获取的SQL查询

如何使用GROUP BY调优简单SQL查询

使用Check查看过go 两个月是否完成了IRM Meetup

Group_CONCAT CASE 乘法输出

如何通过SQL来计算到达特定值的行的数量

GoRM中行最大值查询返回"0"

MySQL 关于 JSON 数组和子查询的问题

在 MYSQL 8 中的 JSON 字段上的 SELECT 中返回所有键及其数组项

如果其中一个表为空,则 mysql 中的查询会给出 0 个结果

SQL使用LIMIT获取结果和结果中的行数

获取 TEXT 类型行的百分比

为什么以及如何将 Django filter-by BooleanField 查询转换为 SQL WHERE 或 WHERE NOT 而不是 1/0?

如何使用同一个表在 2 个字段上左连接

MYSQL 或 Laravel Eloquent 如何从这个订单中统计细节

按长度过滤 varbinary 字段

是否可以从 .SQL 文件中计算表中的行数?

我的 PDO 声明不起作用

在 MySQL 中存储 IPv6 地址