mysql unique 外键_Mysql外键由非唯一键 - 怎么可能?

bd96500e110b49cbb3cd949968f18be7.png

I was migrating mysql database to postgres and stumbled across the following block in DDL (Note: This is what I got from 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;

Now, what I see here is that the only unique key in the first table is combination of (id, sort):

PRIMARY KEY (`id`,`sort`),

however, the second table has a reference to the first on by only id column, which is not unique!

CONSTRAINT `FK_catalog_realty_property_value_link_value` FOREIGN KEY (`value_id`) REFERENCES `catalog_property_value` (`id`) ON DELETE CASCADE

So, what did I get wrong here? How is that possible?

解决方案

From the manual:

Deviation from SQL standards: A

FOREIGN KEY constraint that references

a non-UNIQUE key is not standard SQL.

It is an InnoDB extension to standard

SQL.

So it looks like InnoDB allows non-unique indexes as candidates for foreign key references. Elsewhere the manual states that you can reference a subset of columns in the referenced index as long as the referenced columns are listed first and in the same order as the primary key.

Therefore, this definition is legal in InnoDB, although it's not standard SQL and leaves me, at least, a little confused as to the original designer's intentions.

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值