簡體   English   中英

外鍵約束的格式不正確,但外鍵列和引用鍵列相同

[英]foreign key constraint is incorrectly formed, but both foreign and reference key column are identical

我正在從 MySQL 工作台到 MariaDB 數據庫進行“逆向工程”。 當我執行逆向工程時,我在 pivot 表上收到“外鍵約束錯誤形成”的錯誤,即使引用和外鍵都具有相同的屬性和屬性。

我有 3 個表,其中 2 個是使用 pivot 表具有多對多關系的獨立表。 這些表是users表、 certificates表和users_has_certificates pivot 表。 userscertificates表都使用具有相同類型的id ,即BIGINT(20), NOT NULL, UNSIGNED,AUTO_INCREMENT 但是,在生成 pivot 表時,我得到了約束錯誤形成的錯誤。

運行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 Workbench 不喜歡對某些表進行逆向工程。 解決方案是刪除數據庫中的所有表,使數據庫為空,然后對該數據庫執行逆向工程。 我會將此標記為已解決。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM