【发布时间】:2021-06-12 18:36:37
【问题描述】:
我正在从 MySQL Workbench 到 MariaDB 数据库进行“逆向工程”。当我执行逆向工程时,我在数据透视表上收到“外键约束格式不正确”的错误,即使引用和外键都具有相同的属性和属性。
我有 3 个表,其中 2 个是独立的表,它们使用数据透视表具有多对多关系。这些表是users 表、certificates 表和users_has_certificates 数据透视表。 users 和 certificates 表都使用具有相同类型的 id,即 BIGINT(20), NOT NULL, UNSIGNED, 和 AUTO_INCREMENT。但是,生成数据透视表时出现约束错误。
运行SHOW ENGINE INNODB STATUS时,专门显示这个错误。
LATEST FOREIGN KEY ERROR
------------------------
2021-03-15 21:09:31 0x5a8 Error in foreign key constraint of table `database_this`.`if`:
FOREIGN KEY (`certificate_id`)
REFERENCES `database_this`.`certificates` (`id`)
ON DELETE NO ACTION
ON UPDATE NO ACTION)
ENGINE = InnoDB
DEFAULT CHARACTER SET = utf8mb4
COLLATE = utf8mb4_unicode_ci:
Cannot find an index in the referenced table where the
referenced columns appear as the first columns, or column types
in the table and the referenced table do not match for constraint.
Note that the internal storage type of ENUM and SET changed in
tables created with >= InnoDB-4.1.12, and such columns in old tables
cannot be referenced by such columns in new tables.
Please refer to https://mariadb.com/kb/en/library/foreign-keys/
for correct foreign key definition.
Create table `database_this`.`if` with foreign key constraint failed.
Field type or character set for column 'certificate_id' does not
mach referenced column 'id' near '
FOREIGN KEY (`certificate_id`)
REFERENCES `database_this`.`certificates` (`id`)
ON DELETE NO ACTION
ON UPDATE NO ACTION)
ENGINE = InnoDB
DEFAULT CHARACTER SET = utf8mb4
COLLATE = utf8mb4_unicode_ci'.
这是生成每个表的 SQL 代码。
users表:
CREATE TABLE IF NOT EXISTS `database_this`.`users` (
`id` BIGINT(20) UNSIGNED NOT NULL AUTO_INCREMENT,
`name` VARCHAR(255) NOT NULL,
`email` VARCHAR(255) NOT NULL,
`password` VARCHAR(255) NOT NULL,
`created_at` TIMESTAMP NULL DEFAULT NULL,
`updated_at` TIMESTAMP NULL DEFAULT NULL,
PRIMARY KEY (`id`),
UNIQUE INDEX `users_name_unique` (`name` ASC),
UNIQUE INDEX `users_email_unique` (`email` ASC))
ENGINE = InnoDB
AUTO_INCREMENT = 2
DEFAULT CHARACTER SET = utf8mb4
COLLATE = utf8mb4_unicode_ci;
certificates表:
CREATE TABLE IF NOT EXISTS `database_this`.`certificates` (
`id` BIGINT(20) UNSIGNED NOT NULL AUTO_INCREMENT,
`name` VARCHAR(255) NOT NULL,
`desc` TEXT NULL DEFAULT NULL,
`certifiable_type` VARCHAR(255) NOT NULL,
`certifiable_id` BIGINT(20) UNSIGNED NOT NULL,
`created_at` TIMESTAMP NULL DEFAULT CURRENT_TIMESTAMP(),
`updated_at` TIMESTAMP NULL DEFAULT CURRENT_TIMESTAMP(),
`deleted_at` TIMESTAMP NULL DEFAULT NULL,
PRIMARY KEY (`id`))
ENGINE = InnoDB
DEFAULT CHARACTER SET = utf8mb4;
users_has_certificates表:
CREATE TABLE IF NOT EXISTS `database_this`.`users_has_certificates` (
`user_id` BIGINT(20) UNSIGNED NOT NULL,
`certificate_id` BIGINT(20) UNSIGNED NOT NULL,
`expired_date` DATE NULL,
INDEX `fk_users_has_certificates_certificates1_idx` (`certificate_id` ASC),
INDEX `fk_users_has_certificates_users1_idx` (`user_id` ASC),
CONSTRAINT `fk_users_has_certificates_users1`
FOREIGN KEY (`user_id`)
REFERENCES `database_this`.`users` (`id`)
ON DELETE NO ACTION
ON UPDATE NO ACTION,
CONSTRAINT `fk_users_has_certificates_certificates1`
FOREIGN KEY (`certificate_id`)
REFERENCES `database_this`.`certificates` (`id`)
ON DELETE NO ACTION
ON UPDATE NO ACTION)
ENGINE = InnoDB
DEFAULT CHARACTER SET = utf8mb4
COLLATE = utf8mb4_unicode_ci;
【问题讨论】:
标签: mysql sql database mariadb workbench