如何获得双列唯一键作为外键?

问题描述 投票:0回答:2

我在 MariaDB 11.0.2 中有以下两个表:

CREATE TABLE `Languages` (
  `Name` char(49) DEFAULT NULL,
  `ISO_639_1` char(2) NOT NULL,
  `Language_ID` int(10) unsigned NOT NULL AUTO_INCREMENT,
  `Main_Flag` varchar(20) DEFAULT NULL,
  PRIMARY KEY (`Language_ID`),
  UNIQUE KEY `Languages_UN` (`Language_ID`,`Main_Flag`)
) ENGINE=InnoDB AUTO_INCREMENT=136 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;

CREATE TABLE `Tests` (
  `Test_ID` int(11) unsigned NOT NULL AUTO_INCREMENT,
  `Test_Name` varchar(50) DEFAULT NULL,
  `ISO_639_1` char(2) NOT NULL,
  `Main_Flag` varchar(20) DEFAULT NULL,
  PRIMARY KEY (`Test_ID`)
) ENGINE=InnoDB AUTO_INCREMENT=136 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;

但我无法将双列唯一键分配给其对应项:

MariaDB [my_db]> ALTER TABLE  Tests ADD CONSTRAINT Test_Language_FK FOREIGN KEY (ISO_639_1, Main_Flag) REFERENCES Languages(ISO_639_1, Main_Flag);
ERROR 1005 (HY000): Can't create table `my_db`.`Tests` (errno: 150 "Foreign key constraint is incorrectly formed")

Test表的索引没有异常:

MariaDB [my_db]> show index from Tests;
+-------+------------+----------+--------------+-------------+-----------+-------------+----------+--------+------+------------+---------+---------------+---------+
| Table | Non_unique | Key_name | Seq_in_index | Column_name | Collation | Cardinality | Sub_part | Packed | Null | Index_type | Comment | Index_comment | Ignored |
+-------+------------+----------+--------------+-------------+-----------+-------------+----------+--------+------+------------+---------+---------------+---------+
| Tests |          0 | PRIMARY  |            1 | Test_ID     | A         |          37 |     NULL | NULL   |      | BTREE      |         |               | NO      |
+-------+------------+----------+--------------+-------------+-----------+-------------+----------+--------+------+------------+---------+---------------+---------+
1 row in set (0,001 sec)

是什么阻碍了我?数据类型相同,排序规则和字符集也匹配。

sql mariadb foreign-keys constraints unique-key
2个回答
0
投票

该错误有点神秘,您可以通过使用获取更多信息

SHOW ENGINE INNODB STATUS

LATEST FOREIGN KEY ERROR
部分您会看到
constraint failed. There is no index in the referenced table where the referenced columns appear as the first columns

您需要并索引

CREATE INDEX MYINDEX ON Languages (ISO_639_1, Main_Flag);

看到这个工作小提琴


0
投票

inno den 最好的方法是运行最后一个命令,这样你就可以尝试更多有关错误的信息。

在您的列组合的引用表中缺少唯一键或主键

CREATE TABLE `Languages` (
  `Name` char(49) DEFAULT NULL,
  `ISO_639_1` char(2) NOT NULL,
  `Language_ID` int(10) unsigned NOT NULL AUTO_INCREMENT,
  `Main_Flag` varchar(20) DEFAULT NULL,
  PRIMARY KEY (`Language_ID`),
  UNIQUE KEY `unique_language` (`ISO_639_1`,`Main_Flag`)
) ENGINE=InnoDB AUTO_INCREMENT=136 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;
CREATE TABLE `Tests` (
  `Test_ID` int(11) unsigned NOT NULL AUTO_INCREMENT,
  `Test_Name` varchar(50) DEFAULT NULL,
  `ISO_639_1` char(2) NOT NULL,
  `Main_Flag` varchar(20) DEFAULT NULL,
  PRIMARY KEY (`Test_ID`)
) ENGINE=InnoDB AUTO_INCREMENT=136 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;

ALTER TABLE  Tests 
ADD CONSTRAINT
  Test_Language_FK FOREIGN KEY (ISO_639_1, Main_Flag)
  REFERENCES Languages(ISO_639_1, Main_Flag); 
Records: 0  Duplicates: 0  Warnings: 0
show engine innodb status
类型 姓名 状态
InnoDB
========================================
2023-07-29 20:36:04 0x7f8018926700 INNODB 监控输出

小提琴

© www.soinside.com 2019 - 2024. All rights reserved.