创建(更改)外键时遇到问题。
我的数据库中有两个表(通过flyway迁移创建):
- 连接器(迁移)**
create table if not exists connector
(
id char(36) not null,
# other fields omitted
primary key (id)
) DEFAULT CHARACTER SET 'utf8mb4'
COLLATE 'utf8mb4_unicode_520_ci';
- 连接器预设(迁移)**
CREATE TABLE IF NOT EXISTS connector_preset
(
id CHAR(36) NOT NULL,
# other fields omitted
PRIMARY KEY (id)
);
我想在connector和connector_preset之间创建一个链接,因此我创建了另一个迁移,如下所示:
ALTER IGNORE TABLE `connector`
# `connector_preset`.`id`
ADD COLUMN IF NOT EXISTS `preset_id` CHAR(36),
ADD CONSTRAINT `fk_connector_preset_id` FOREIGN KEY (`preset_id`) REFERENCES `connector_preset` (`id`);
但它失败,并显示以下错误:
SQL State : HY000
Error Code : 1005
Message : (conn=4) Can't create table `test`.`connector` (errno: 150 "Foreign key constraint is incorrectly formed")
Location : db/migration/...
Line : 34
Statement : ALTER IGNORE TABLE `connector`
# `connector_preset`.`id`
ADD COLUMN IF NOT EXISTS `preset_id` CHAR(36),
ADD CONSTRAINT `fk_connector_preset_id` FOREIGN KEY (`preset_id`) REFERENCES `connector_preset` (`id`),
这些列似乎属于同一类型。此外,由于某种原因,它在本地k8s集群(10.3.29-MariaDB)中工作,但在集成测试(testcontainers,MariaDB 10.6.11)中失败。在使用10.3.29的GH操作中也失败,这很奇怪,因为它在本地工作。
- UPD:**如果我将testcontainers中的mariadb版本设置为10.3.29-它仍然失败。
- UPD:已尝试更改connector_preset**表以使用相同的字符集和归类:
ALTER IGNORE TABLE `connector_preset` DEFAULT CHARACTER SET 'utf8mb4' COLLATE 'utf8mb4_unicode_520_ci';
还是不行
1条答案
按热度按时间0tdrvxhp1#
表
connector
是使用字符集utf8mb4和排序规则utf8mb4_unicode_520_ci创建的,而connector_preset是使用服务器的默认字符集和排序规则创建的,这两者明显不同。因此,您必须将表转换为正确的字符集。
您尝试使用
ALTER TABLE ... DEFAULT CHARACTER SET 'utf8mb4'
更改它将设置表的默认字符集,但不会设置列的默认字符集。您必须使用以下命令转换它: