如何在MariaDB中添加复合外键但仍然允许空值?[副本]

txu3uszq  于 2023-05-22  发布在  其他
关注(0)|答案(1)|浏览(150)

此问题已在此处有答案

MySQL Creating tables with Foreign Keys giving errno: 150(20个回答)
2天前关闭。
我有两个表,entityentity_roleentity看起来像这样:

CREATE TABLE `entity` (
  `id` varchar(36) NOT NULL,
  `type` varchar(36) NOT NULL,
  `name` varchar(150) NOT NULL,
  PRIMARY KEY (`id`,`type`)
);

entity_role看起来像这样:

CREATE TABLE `entity_role` (
  `id` varchar(36) NOT NULL,
  `entity_type` varchar(36) DEFAULT NULL,
  `user_id` varchar(36) NOT NULL,
  `role_id` varchar(36) NOT NULL,
  `entity_id` varchar(36) DEFAULT NULL,
  PRIMARY KEY (`id`),
  KEY `FK_entity_role_user_id` (`user_id`),
  KEY `FK_entity_role_role_id` (`role_id`),
  CONSTRAINT `FK_entity_role_role_id` FOREIGN KEY (`role_id`) REFERENCES `role` (`id`),
  CONSTRAINT `FK_entity_role_user_id` FOREIGN KEY (`user_id`) REFERENCES `user` (`id`)
);

我正在尝试通过运行以下语句将外键引用从entity_role添加到entity

alter table entity_role add constraint `FK_entity_role_entity`
  foreign key(`entity_id`, `entity_type`)
  references `entity`(`id`, `type`)
  on delete cascade;

我从服务器返回:[代码:1005,SQL状态:HY000](conn=26)无法创建表entity_role(错误号:150“外键约束格式不正确”)
我已经看了很多次,并阅读了MariaDB文档几次,我觉得我现在正在用头撞墙。有人知道我做错了什么吗?这两个表都使用InnoDB引擎。

kknvjkwl

kknvjkwl1#

原来the answer to this question正是我要找的。具体来说,MariaDB不会告诉你为什么它不喜欢你的外键,除非你去问特定的引擎:

SHOW ENGINE InnoDB STATUS;

不会张贴文字墙,但这一行特别是相关的位(和有益的是在最顶部!):

2023-05-19 14:39:14 0x7fc78c15e640 Error in foreign key constraint of table `default`.`entity_role`:
Alter  table `default`.`entity_role` with foreign key `FK_entity_role_entity` constraint failed. Field type or character set for column 'entity_type' does not match referenced column 'type'.------------

我在问题中忽略了这一点,没有意识到它们是相关的,但是varchar列都有ascii_bin排序规则。所有这些,也就是说,* 除了 * entity_role上的entity_type列,它根本没有设置(我假设这意味着使用表默认值)!修改列以使用匹配的排序规则解决了问题。

相关问题