mysql - 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;
但在这种情况下也没有工作。
可能吗 ?
解决方案
据我所知,您不能使用唯一约束来执行此操作,因为正如您已经发现的那样,无论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 ;
此插入触发器将导致任何带有您的唯一索引定义为重复数据的插入传入失败并出现错误,从而有效地阻止该插入。
一个更好的长期(和更容易)的策略可能是修复旧数据,以便它可以通过唯一约束的要求。
推荐阅读
- arrays - Matlab tall 数组和内存
- solr - 一个字段中每个匹配值的多重提升
- python - 在html中编码ascii符号
- c++ - 无法在 VS2017 中包含 rapidjson 库
- javascript - 传递太多数据作为参数是一种不好的做法吗?
- mysql - 根据关系将两个表连接到一个辅助表中
- javascript - 如何删除数组中的数组?json的AJAX数据
- android - 在 Android 活动之间传递 Location 对象
- asp.net-mvc - 提交时 iframe 内的表单不起作用
- android - java.net.ProtocolException:Android 流意外结束