簡體   English   中英

SQL(MySQL):強制不同值連續兩列的最佳方法?

[英]SQL (MySQL): Best way to force different values two columns of a row?

給出下表:

CREATE TABLE `tbl_termsynonyms` (
 `ts_term1Id` int(10) unsigned NOT NULL,
 `ts_term2Id` int(10) unsigned NOT NULL,
 PRIMARY KEY (`ts_term1Id`,`ts_term2Id`),
 KEY `fk_tbl_termSynonyms_tbl_term_t_id2` (`ts_term2Id`),
 CONSTRAINT `fk_tbl_termSynonyms_tbl_term_t_id1` FOREIGN KEY (`ts_term1Id`) REFERENCES `tbl_term` (`t_id`) ON DELETE CASCADE ON UPDATE CASCADE,
 CONSTRAINT `fk_tbl_termSynonyms_tbl_term_t_id2` FOREIGN KEY (`ts_term2Id`) REFERENCES `tbl_term` (`t_id`) ON DELETE CASCADE ON UPDATE CASCADE
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci

如您所見,該表用於引用tbl_term表中的同義詞。

示例:表tbl_term包含ID為34和71的單詞“ fun”和“ joke”,這些ID一起保存為一行。

現在,我要防止術語引用自身的行,例如:

71 - 71
31 - 31

是否有(SQL方式)輕松實現這一目標?

在SQL中有一種簡單的方法可以做到這一點:

alter table tbl_termsynonyms add constraint chk_ts_term1Id_ts_term2Id check (ts_term1Id <> ts_term2Id);

不幸的是,MySQL忽略了檢查約束,因此這在MySQL中不起作用。

las,您唯一的選擇是使用觸發器。

據推測,您的數據中可能存在循環-因此3是4的同義詞,而4是3的同義詞。如果是這種情況,我看不到將術語作為其自身的同義詞的真正危害。

您可以在查詢表時將它們過濾掉:

create view vw_termsynonyms as
    select ts.*
    from tbl_termsynonyms ts
    where ts_term1Id <> ts_term2Id;

您可能要求ts_term1Id必須小於ts_term2Id。 MySQL沒有CHECK約束,因此您必須在觸發器中執行它。

CREATE TRIGGER MyTrigger BEFORE INSERT ON tbl_termsynonyms
FOR EACH ROW
  SET NEW.ts_term1Id = LEAST(NEW.ts_term1Id, NEW.ts_term2Id),
      NEW.ts_term2Id = GREATEST(NEW.ts_term1Id, NEW.ts_term2Id);

我還沒有測試過,所以我不完全確定您可以在單個SET語句中完成此操作。 您可能需要局部變量。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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