mysql - 创建具有 NULL 值的复合唯一索引的首选方法

标签 mysql sql indexing

我的数据库中有以下值:

enter image description here

我想在 tv_series_id+name+tv_season_number+tv_episode_number 上创建一个唯一的 key 。但是,使用传统方法,上述内容不适用于我的目的:

ALTER TABLE main_itemmaster ADD UNIQUE KEY (tv_series_id, tv_season_number, tv_episode_number, name)

因为空值。在数据库级别(而不是查询端)解决此问题的方法是什么?

需要澄清的是,上述内容不应被允许,因为“97736-Season 4-4-NULL”重复了 10 次。我考虑作为最后手段实现的解决方案是存储一个额外的字符串列以确保唯一性,因此上述内容为“97736-Season 4-4-”。

最佳答案

根据要求,我的建议(未经测试):

ALTER TABLE main_itemmaster ADD COLUMN uniquer BIGINT NOT NULL;
DELIMITER $$
CREATE TRIGGER add_uniquer BEFORE INSERT ON main_itemmaster
FOR EACH ROW
  BEGIN
    SET NEW.uniquer = (SELECT UUID_SHORT());
  END $$
DELIMITER ;
ALTER TABLE main_itemmaster ADD UNIQUE KEY (tv_series_id, tv_season_number, tv_episode_number, name, uniquer);

uniquer 背后的算法完全取决于您。我选择了short UUID这里。您可能需要一个长 UUID。或 UUID might not be right for you 。基于时间的可能会起作用。您可以将其基于插入行中值的 MD5。

关于mysql - 创建具有 NULL 值的复合唯一索引的首选方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36093788/

相关文章:

mysql - Sequelize - 从关联表中返回单个列作为自定义列

php - MySQL 和 PhpMyAdmin : Undefined index: Rows

php - Codeigniter 连接过多 __construct()

mysql - 多列索引(名称,类型)对于带有 in 运算符的 where 子句有用吗

algorithm - 在 mongodb 中使用索引的运行时

sql - 索引是否有助于列数多但记录数少的表?

python - SQL join、where、having 子句出现问题

sql - 日期的唯一约束

c# - 使用 Entity Framework 从嵌套表中获取数据

sql - 完全外连接仅采用左表(但没有 where 子句)