首页 > 解决方案 > mysql添加唯一的多列而不检查实际数据

问题描述

对于带有 mariaDb 10.4.10 的 mysql v8.0.18 项目

我想在现有表中添加多列的唯一约束

ALTER TABLE  'new_purchasseorder' ADD UNIQUE ('created', 'fk_customer_id', 'fk_removal_id', 'fk_recipient_id')

但不想检查旧数据

类似的东西:

where id > 3869

我也尝试过,SET FOREIGN_KEY_CHECKS=0;但在这种情况下也没有工作。

可能吗 ?

我的桌子看起来像:在此处输入图像描述

标签: mysqlsqlunique-constraintunique-index

解决方案


据我所知,您不能使用唯一约束来执行此操作,因为正如您已经发现的那样,无论id值如何,这样的约束都将应用于整个表。一种解决方法可能是使用插入前触发器,它执行断言:

DELIMITER //
CREATE TRIGGER contacts_before_insert
BEFORE INSERT ON new_purchasseorder FOR EACH ROW

BEGIN

IF EXISTS (SELECT 1 FROM new_purchasseorder
           WHERE created = NEW.created AND
                 fk_customer_id = NEW.fk_customer_id AND
                 fk_removal_id = NEW.fk_removal_id AND
                 fk_recipient_id = NEW.fk_recipient_id)
THEN
    signal sqlstate '45000';
END IF;

END; //

DELIMITER ;

此插入触发器将导致任何带有您的唯一索引定义为重复数据的插入传入失败并出现错误,从而有效地阻止该插入。

一个更好的长期(和更容易)的策略可能是修复旧数据,以便它可以通过唯一约束的要求。


推荐阅读