簡體   English   中英

如何實現條件唯一約束

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM