这是我的问题:
我想在两个相同类型的项目之间建立关系。
基本上,我有一个“标签”表,我想在标签之间建立关系。
我创建了一个表'tag_relations'。在此表中,每一行代表一个关系。它将由2个属性组成:tag_id(这是与该关系有关的标签的ID)和Relation(这是与与tag_id表示的第一个标签相关的标签的ID)。
我将“ tag_relations”表的主键设置为这两个属性中的两个。
这是我创建表格的方式:
CREATE TABLE `tag_relation` (
`tag_id` int(11) NOT NULL,
`relation` int(11) NOT NULL,
PRIMARY KEY (`tag_id`,`relation`),
KEY `relation` (`relation`),
CONSTRAINT `tag_relation_ibfk_1` FOREIGN KEY (`tag_id`) REFERENCES `tag` (`id`),
CONSTRAINT `tag_relation_ibfk_2` FOREIGN KEY (`relation`) REFERENCES `tag` (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
我的问题是:如果我的表中已经有一对(1,2)(因此标签1与标签2相关),如何确保我不可能插入该对(2, 1)(因为此关系已经隐式存在)。
我被迫创建触发器吗?
预先感谢
答案 0 :(得分:1)
某些数据库支持表达式索引。从5.7开始,MySQL生成带有索引的列。这允许您执行以下操作:
alter table tag_relation add tag1 generated always as (least(tag1, relation));
alter table tag_relation add tag2 generated always as (greatest(tag1, relation));
create unique index unq_tag_relation_tag1_tag2 on tag_relation(tag1, tag2);
在早期版本中,您需要一个insert
(可能还有update
)触发器来确保数据完整性。