MySQL如何设置键保证id字段的绝对值唯一?
绝对值唯一约束实现方案
你执行的ALTER TABLE table ADD KEY(ABS(id));报错是因为绝大多数数据库不支持直接在普通索引声明中直接使用未包裹的函数表达式,如果你使用的是MySQL 8.0及以上版本,该语法报错的直接原因是函数表达式需要额外加一层括号包裹。不同数据库的适配方案如下:
方案适配
MySQL 环境
- 5.7及以上版本可以用存储生成列实现:
第一步添加生成列:
第二步给生成列加唯一约束:ALTER TABLE `你的表名` ADD COLUMN abs_id INT UNSIGNED GENERATED ALWAYS AS (ABS(`id`)) STORED;ALTER TABLE `你的表名` ADD UNIQUE KEY `uk_abs_id` (`abs_id`); - 8.0及以上版本支持函数索引,可以不用加额外列:
ALTER TABLE `你的表名` ADD UNIQUE KEY `uk_abs_id` ((ABS(`id`)));
PostgreSQL 环境
原生支持表达式唯一约束,直接执行以下语句即可:
ALTER TABLE 你的表名 ADD CONSTRAINT uk_abs_id UNIQUE (ABS(id));
SQL Server 环境
需要先加持久化计算列再加唯一约束:
ALTER TABLE 你的表名 ADD abs_id AS ABS(id) PERSISTED; ALTER TABLE 你的表名 ADD CONSTRAINT uk_abs_id UNIQUE (abs_id);
前置检查注意
创建唯一约束前请先确认表内无已有绝对值重复的id,否则会创建失败,可以用以下语句查询重复项:
SELECT ABS(id) AS 重复绝对值, COUNT(*) AS 出现次数 FROM 你的表名 GROUP BY ABS(id) HAVING COUNT(*) > 1;
内容的提问来源于stack exchange,提问作者GFL
相关产品推荐
相关产品推荐

