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