尽管列的类型相同,但MariaDB约束的格式不正确

fhg3lkii  于 2023-02-08  发布在  其他
关注(0)|答案(1)|浏览(110)

创建(更改)外键时遇到问题。
我的数据库中有两个表(通过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)
);

我想在connectorconnector_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';

还是不行

0tdrvxhp

0tdrvxhp1#

connector是使用字符集utf8mb4和排序规则utf8mb4_unicode_520_ci创建的,而connector_preset是使用服务器的默认字符集和排序规则创建的,这两者明显不同。
因此,您必须将表转换为正确的字符集。
您尝试使用ALTER TABLE ... DEFAULT CHARACTER SET 'utf8mb4'更改它将设置表的默认字符集,但不会设置列的默认字符集。您必须使用以下命令转换它:

ALTER TABLE connector_preset CONVERT TO CHARSET utf8mb4 COLLATE utf8mb4_unicode_520_ci

相关问题