Mysql外键由非唯一键 - 这怎么可能?

Max*_*yko 7 mysql database-design foreign-keys

我正在将mysql数据库迁移到postgres并偶然发现DDL中的以下块(注意:这是我从mysqldump获得的):

CREATE TABLE `catalog_property_value` (
  `id` int(10) unsigned NOT NULL,
  `property_id` int(10) unsigned NOT NULL,
  `sort` int(10) unsigned NOT NULL,
  `value_number` decimal(15,5) DEFAULT NULL,
  `value_string` varchar(255) DEFAULT NULL,
  PRIMARY KEY (`id`,`sort`),
  KEY `FK_catalog_property_value` (`property_id`),
  KEY `NewIndex1` (`id`),
  CONSTRAINT `FK_catalog_property_value` FOREIGN KEY (`property_id`) REFERENCES `catalog_property` (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
SET character_set_client = @saved_cs_client;

CREATE TABLE `catalog_realty_property_value_link` (
  `realty_id` int(10) unsigned NOT NULL,
  `property_id` int(10) unsigned NOT NULL,
  `value_id` int(10) unsigned NOT NULL,
  `dt_is_denormalized` tinyint(1) unsigned NOT NULL,
  PRIMARY KEY (`realty_id`,`property_id`,`value_id`),
  KEY `FK_catalog_realty_property_value_link_property` (`property_id`),
  KEY `FK_catalog_realty_property_value_link_value` (`value_id`),
  CONSTRAINT `FK_catalog_realty_property_value_link_property` FOREIGN KEY (`property_id`) REFERENCES `catalog_property` (`id`) ON DELETE CASCADE,
  CONSTRAINT `FK_catalog_realty_property_value_link_realty` FOREIGN KEY (`realty_id`) REFERENCES `catalog_realty` (`id`) ON DELETE CASCADE ON UPDATE CASCADE,
  CONSTRAINT `FK_catalog_realty_property_value_link_value` FOREIGN KEY (`value_id`) REFERENCES `catalog_property_value` (`id`) ON DELETE CASCADE
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
Run Code Online (Sandbox Code Playgroud)

现在,我在这里看到的是第一个表中唯一唯一的键是(id,sort)的组合:

PRIMARY KEY (`id`,`sort`),
Run Code Online (Sandbox Code Playgroud)

但是,第二个表只有id列的第一个引用,这不是唯一的!

CONSTRAINT `FK_catalog_realty_property_value_link_value` FOREIGN KEY (`value_id`) REFERENCES `catalog_property_value` (`id`) ON DELETE CASCADE
Run Code Online (Sandbox Code Playgroud)

那么,我在这里弄错了什么?怎么可能?

Lar*_*tig 8

从手册:

与SQL标准的偏差:引用非UNIQUE键的FOREIGN KEY约束不是标准SQL.它是标准SQL的InnoDB扩展.

所以看起来InnoDB允许非唯一索引作为外键引用的候选者.在其他地方,手册指出您可以引用引用索引中的列子集,只要引用的列首先列出并且与主键的顺序相同.

因此,这个定义在InnoDB中是合法的,虽然它不是标准的SQL,但至少让我对原始设计者的意图有点困惑.

手册页在这里.