这两种方式的主键对都是唯一的

时间:2018-10-22 14:49:57

标签: mysql sql

这是我的问题:

我想在两个相同类型的项目之间建立关系。

基本上,我有一个“标签”表,我想在标签之间建立关系。

我创建了一个表'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)(因为此关系已经隐式存在)。

我被迫创建触发器吗?

预先感谢

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)触发器来确保数据完整性。