MySQL错误在<ColumName>上创建外键(检查数据类型)

Kor*_*rts 10 mysql foreign-keys foreign-key-relationship

我似乎在设置Foreign Key两个表之间时遇到了麻烦.

以下是CREATE每个表的子句:

CREATE TABLE IF NOT EXISTS `dbname`.`CallRecord` (
  `id` INT NOT NULL AUTO_INCREMENT,
  `user_id` INT NOT NULL,
  `city_id` INT NOT NULL,
  `created` DATETIME NULL,
  `timestamp` TIMESTAMP NULL,
  PRIMARY KEY (`id`),
  INDEX `user_id_fk_idx` (`user_id` ASC),
  INDEX `city_id_fk_idx` (`city_id` ASC),
  CONSTRAINT `user_id_fk`
    FOREIGN KEY (`user_id`)
    REFERENCES `dbname`.`User` (`id`)
    ON DELETE RESTRICT
    ON UPDATE NO ACTION,
  CONSTRAINT `city_id_fk`
    FOREIGN KEY (`city_id`)
    REFERENCES `dbname`.`City` (`id`)
    ON DELETE RESTRICT
    ON UPDATE NO ACTION)
ENGINE = InnoDB;
Run Code Online (Sandbox Code Playgroud)

这是另一张桌子:

CREATE TABLE IF NOT EXISTS `dbname`.`DataCallAssoc` (
  `id` INT NOT NULL AUTO_INCREMENT,
  `data_id` INT NOT NULL,
  `call_record_id` INT NOT NULL,
  PRIMARY KEY (`id`),
  INDEX `data_id_fk_idx` (`data_id` ASC),
  INDEX `call_record_id_fk_idx` (`call_record_id` ASC),
  CONSTRAINT `data_id_fk`
    FOREIGN KEY (`data_id`)
    REFERENCES `dbname`.`Data` (`id`)
    ON DELETE CASCADE
    ON UPDATE NO ACTION,
  CONSTRAINT `call_record_id_fk`
    FOREIGN KEY (`call_record_id`)
    REFERENCES `dbname`.`CallRecord` (`id`)
    ON DELETE CASCADE
    ON UPDATE NO ACTION)
ENGINE = InnoDB;
Run Code Online (Sandbox Code Playgroud)

问题在于最后CONSTRAINT一个DataCallAssoc:

  CONSTRAINT `call_record_id_fk`
    FOREIGN KEY (`call_record_id`)
    REFERENCES `dbname`.`CallRecord` (`id`)
    ON DELETE CASCADE
    ON UPDATE NO ACTION)
Run Code Online (Sandbox Code Playgroud)

我收到此错误:

Error creating foreign key on call_record_id (check data types)

即使我单独创建表和外键.每个其他外键都可以工作,甚至其他指向CallRecord.id外键的表也​​可以工作.

我还检查了结构方面CallRecord.id的相同DataCallAssoc.call_record_id.

ade*_*mup 37

如果您已在另一个表中具有相同名称的外键,则会出现创建外键错误...(检查数据类型)错误.因此,如果您遇到这个最无用的错误消息,请确保您的数据类型匹配,并且外键名称是唯一的.希望这有助于某人.

  • 只要你一直使用自动生成的名称(将fk字段保留为空),那么你就不会有交叉表"冲突",因为phpMyAdmin将名称加上当前表的前缀,然后将fk号添加到结尾.所以基本上:不,我不认为你会遇到这种特殊的错误情况.另一方面,它可能会使故障排除更加困难,因为您的外键没有更简洁/有意识地命名. (3认同)
  • 我不会想到这一点.让phpMyAdmin自动生成约束名称可以吗? (2认同)

Ric*_*ard 8

除了确保数据类型相同外,对于某些类型(如bigint(20)),如果主键是无符号的,则外键也必须是无符号的."unsigned"是字段的属性之一.


jch*_*360 1

我能够在我的本地主机中重新创建您的表,我从第一个删除了它create,因为您没有显示USERCity表的结构,所以错误应该在那里

CONSTRAINT `user_id_fk`
    FOREIGN KEY (`user_id`)
    REFERENCES `dbname`.`User` (`id`)
    ON DELETE RESTRICT
    ON UPDATE NO ACTION,
  CONSTRAINT `city_id_fk`
    FOREIGN KEY (`city_id`)
    REFERENCES `dbname`.`City` (`id`)
    ON DELETE RESTRICT
    ON UPDATE NO ACTION) 
Run Code Online (Sandbox Code Playgroud)

这就是我使用的原因。

CREATE TABLE IF NOT EXISTS `CallRecord` (
      `id` INT NOT NULL AUTO_INCREMENT,
      `user_id` INT NOT NULL,
      `city_id` INT NOT NULL,
      `created` DATETIME NULL,
      `timestamp` TIMESTAMP NULL,
      PRIMARY KEY (`id`),
      INDEX `user_id_fk_idx` (`user_id` ASC),
      INDEX `city_id_fk_idx` (`city_id` ASC)
    )
    ENGINE = InnoDB


    CREATE TABLE IF NOT EXISTS `DataCallAssoc` (
      `id` INT NOT NULL AUTO_INCREMENT,
      `data_id` INT NOT NULL,
      `call_record_id` INT NOT NULL,
      PRIMARY KEY (`id`),
      INDEX `data_id_fk_idx` (`data_id` ASC),
      INDEX `call_record_id_fk_idx` (`call_record_id` ASC),
        CONSTRAINT `call_record_id_fk`
        FOREIGN KEY (`call_record_id`)
        REFERENCES `CallRecord` (`id`)
        ON DELETE CASCADE
        ON UPDATE NO ACTION)
    ENGINE = InnoDB
Run Code Online (Sandbox Code Playgroud)

在此输入图像描述