[英]How to implement conditional unique constraint
我有一個表需要 3 列的唯一約束,但是,如果該插入事務中的“日期”列是比當前記錄的日期更新的日期,那么我想更新該記錄(因此唯一約束仍然是對於表是正確的)。
Postgres 有 deferrable constraints 的概念,MySQL 沒有。
不過,我確實想使用可用的 SQL object 工具來實現它。
這是我的表 DDL,其中的列名被混淆了:
CREATE TABLE `apixio_results_test_sefath` (
`ID` int(11) NOT NULL AUTO_INCREMENT,
`number` varchar(20) DEFAULT NULL,
`insert_date` datetime DEFAULT NULL,
`item_id` int(5) DEFAULT NULL,
`rule` tinyint(4) DEFAULT NULL,
`another_column` varchar(20) DEFAULT NULL,
`another_column1` varchar(20) DEFAULT NULL,
PRIMARY KEY (`ID`),
KEY `insert_date_index` (`insert_date`),
KEY `number` (`number`),
) ENGINE=InnoDB AUTO_INCREMENT=627393 DEFAULT CHARSET=latin1
這是唯一約束語句
Alter Table dbname.table add unique constraint my_unique_constraint (number, item_id, rule);
但我不能在此約束中添加條件(除非有一種我不知道的方法?)在插入被約束阻止之前我需要運行的邏輯是檢查三個值是否:number、item_id、和規則在表中是唯一的,如果不是,那么我想將現有記錄的 insert_date 與事務中的 insert_date 進行比較,並且只保留具有最新 insert_date 的記錄。
我想這可以通過觸發器來實現,盡管我聽說只有在真正需要時才使用觸發器。 在每次插入時,此觸發器都會對數據庫造成相當大的計算負擔。 有什么建議嗎? 我可以使用任何其他 sql 技巧嗎? 或者有什么可以幫助我指出如何觸發這個觸發器的嗎?
我嘗試了唯一約束語句
Alter Table dbname.table add unique constraint my_unique_constraint (number, item_id, rule);
但它永遠不會更新為更新的 insert_date。
您可以使用如下插入語句執行此操作:
insert into apixio_results_test_sefath (number, item_id, rule, insert_date, another_column, another_column1)
values (?,?,?,?,?,?)
on duplicate key update
another_column=if(insert_date>values(insert_date),another_column,values(another_column),
another_column1=if(insert_date>values(insert_date),another_column1,values(another_column1),
insert_date=greatest(insert_date,values(insert_date)
對於除了唯一列和 insert_date 之外的每一列,測試現有的 insert_date 是否大於插入提供的值,並有條件地使用現有值或基於該值的另一列的新值,並且僅在以下情況下才更新 insert_date現在更大了。
mysql 8 有一個替代語法,它更喜歡使用值 function,但值 function 仍然有效。
如果您希望所有插入都自動發生這種情況,則需要使用觸發器。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.