【问题标题】:Selected columns dont have compatiable type, even it has same type选定的列没有兼容的类型,即使它具有相同的类型
【发布时间】:2016-10-02 10:24:35
【问题描述】:

我正在使用 groupName 从 Table2 的 Table1(propType) 上创建 FOREIGN KEY。但我面临以下错误。 选定的列没有兼容的类型,即使它在 mysql 中具有相同的类型

表 1:

    CREATE TABLE `configuration_master` (
      `id` bigint(20) NOT NULL AUTO_INCREMENT,
      `insertTimestamp` datetime DEFAULT NULL,
      `propName` varchar(255) COLLATE utf8_unicode_ci NOT NULL,
      `propValue` varchar(255) COLLATE utf8_unicode_ci DEFAULT NULL,
      `propType` varchar(45) COLLATE utf8_unicode_ci DEFAULT NULL,
      `IsCloudSupport` varchar(45) COLLATE utf8_unicode_ci DEFAULT NULL,
      `DisplayName` varchar(45) COLLATE utf8_unicode_ci DEFAULT NULL,
      `updateTimestamp` datetime DEFAULT NULL,
      `userId` bigint(20) DEFAULT NULL,
      `SYNCCOL1` varchar(255) COLLATE utf8_unicode_ci DEFAULT NULL,
      `SYNCCOL2` varchar(255) COLLATE utf8_unicode_ci DEFAULT NULL,
      `SYNCCOL3` varchar(255) COLLATE utf8_unicode_ci DEFAULT NULL,
      `SYNCCOL4` varchar(255) COLLATE utf8_unicode_ci DEFAULT NULL,
      `SYNCCOL5` varchar(255) COLLATE utf8_unicode_ci DEFAULT NULL,
      `SYNCCOL6` varchar(255) COLLATE utf8_unicode_ci DEFAULT NULL,
      `SYNCCOL7` varchar(255) COLLATE utf8_unicode_ci DEFAULT NULL,
      `SYNCCOL8` varchar(255) COLLATE utf8_unicode_ci DEFAULT NULL,
      `SYNCCOL9` varchar(255) COLLATE utf8_unicode_ci DEFAULT NULL,
      `SYNCCOL10` varchar(255) COLLATE utf8_unicode_ci DEFAULT NULL,
      `prptyp` int(11) DEFAULT NULL,
      PRIMARY KEY (`id`),
      UNIQUE KEY `propName` (`propName`),
      KEY `FKB54491EB8E326E43` (`userId`),
      KEY `proptype_frn_idx` (`propType`),
      KEY `ASD_idx` (`prptyp`),
      CONSTRAINT `FKB54491EB8E326E43` FOREIGN KEY (`userId`) REFERENCES `user_master` (`id`)
    ) ENGINE=InnoDB AUTO_INCREMENT=86 DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci;

表2:

    CREATE TABLE `config_group` (
      `groupName` varchar(45) CHARACTER SET utf8 NOT NULL,
      `prop1` varchar(200) COLLATE utf8_unicode_ci DEFAULT NULL,
      `prop2` varchar(200) COLLATE utf8_unicode_ci DEFAULT NULL,
      `prop3` varchar(200) COLLATE utf8_unicode_ci DEFAULT NULL,
      `prop4` varchar(200) COLLATE utf8_unicode_ci DEFAULT NULL,
      `ADS` int(11) DEFAULT NULL,
      `config_groupcol` varchar(45) COLLATE utf8_unicode_ci DEFAULT NULL,
      PRIMARY KEY (`groupName`),
      UNIQUE KEY `config_groupcol_UNIQUE` (`config_groupcol`),
      UNIQUE KEY `ADS_UNIQUE` (`ADS`)
    ) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci;

我正在创建 FOREIGN KEY 如下

    ALTER TABLE `konysyncconsoledb7214dev`.`configuration_master` 
    ADD CONSTRAINT `FK_configGrop`
      FOREIGN KEY (`propType`)
      REFERENCES `konysyncconsoledb7214dev`.`config_group` (`groupName`)

下图是错误信息。如果有人遇到这个问题,请让我知道我错过了什么。

【问题讨论】:

  • 不要忘记支持、反对、接受适当的答案。这是我们的反馈,并鼓励我们帮助下一个人。

标签: mysql sql database foreign-keys


【解决方案1】:

从mysql手册页找到here

外键和引用键中的对应列必须 具有相似的数据类型。整数类型的大小和符号必须是 相同。字符串类型的长度不必相同。为了 非二进制(字符)字符串列、字符集和排序规则 必须相同。

您的问题是排序规则。我创建以下任何内容都没有问题。请注意,我不得不从其中的一部分中删除您的数据库名称。

哦,由于您没有提供第三个表,我不得不删除该 FK 约束。但这不是问题。

注意,可空性不是问题。

您决定如何处理排序选择取决于您自己。但就是这样。

CREATE TABLE `configuration_master` (
  `id` bigint(20) NOT NULL AUTO_INCREMENT,
  `insertTimestamp` datetime DEFAULT NULL,
  `propName` varchar(255) COLLATE utf8_unicode_ci NOT NULL,
  `propValue` varchar(255) COLLATE utf8_unicode_ci DEFAULT NULL,
  `propType` varchar(45) COLLATE utf8_unicode_ci DEFAULT NULL,
  `IsCloudSupport` varchar(45) COLLATE utf8_unicode_ci DEFAULT NULL,
  `DisplayName` varchar(45) COLLATE utf8_unicode_ci DEFAULT NULL,
  `updateTimestamp` datetime DEFAULT NULL,
  `userId` bigint(20) DEFAULT NULL,
  `SYNCCOL1` varchar(255) COLLATE utf8_unicode_ci DEFAULT NULL,
  `SYNCCOL2` varchar(255) COLLATE utf8_unicode_ci DEFAULT NULL,
  `SYNCCOL3` varchar(255) COLLATE utf8_unicode_ci DEFAULT NULL,
  `SYNCCOL4` varchar(255) COLLATE utf8_unicode_ci DEFAULT NULL,
  `SYNCCOL5` varchar(255) COLLATE utf8_unicode_ci DEFAULT NULL,
  `SYNCCOL6` varchar(255) COLLATE utf8_unicode_ci DEFAULT NULL,
  `SYNCCOL7` varchar(255) COLLATE utf8_unicode_ci DEFAULT NULL,
  `SYNCCOL8` varchar(255) COLLATE utf8_unicode_ci DEFAULT NULL,
  `SYNCCOL9` varchar(255) COLLATE utf8_unicode_ci DEFAULT NULL,
  `SYNCCOL10` varchar(255) COLLATE utf8_unicode_ci DEFAULT NULL,
  `prptyp` int(11) DEFAULT NULL,
  PRIMARY KEY (`id`),
  UNIQUE KEY `propName` (`propName`),
  KEY `FKB54491EB8E326E43` (`userId`),
  KEY `proptype_frn_idx` (`propType`),
  KEY `ASD_idx` (`prptyp`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci;



 CREATE TABLE `config_group` (
  `groupName` varchar(45) COLLATE utf8_unicode_ci NOT NULL,
  `prop1` varchar(200) COLLATE utf8_unicode_ci DEFAULT NULL,
  `prop2` varchar(200) COLLATE utf8_unicode_ci DEFAULT NULL,
  `prop3` varchar(200) COLLATE utf8_unicode_ci DEFAULT NULL,
  `prop4` varchar(200) COLLATE utf8_unicode_ci DEFAULT NULL,
  `ADS` int(11) DEFAULT NULL,
  `config_groupcol` varchar(45) COLLATE utf8_unicode_ci DEFAULT NULL,
  PRIMARY KEY (`groupName`),
  UNIQUE KEY `config_groupcol_UNIQUE` (`config_groupcol`),
  UNIQUE KEY `ADS_UNIQUE` (`ADS`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci;   

ALTER TABLE  `configuration_master` 
ADD CONSTRAINT `FK_configGrop`
  FOREIGN KEY (`propType`)
  REFERENCES `config_group` (`groupName`);

原件的更多细节

这解决了 Barmar 的评论。您为 config_group 创建的表导致 FK 与 ALTER TABLE 的匹配排序规则出现差异。 SHOW FULL COLUMNS的手册页

来自手册页here

如果在没有 COLLATE 的情况下指定了 CHARACTER SET X,则字符集 X 和 使用其默认排序规则。

CREATE TABLE t1
(
    col1 CHAR(10) CHARACTER SET utf8
) CHARACTER SET latin1 COLLATE latin1_bin;

为列指定了字符集,但排序规则是 不是。该列具有字符集 utf8 和默认排序规则 utf8,即 utf8_general_ci。查看每个的默认排序规则 字符集,使用 SHOW COLLATION 语句。

【讨论】:

  • 在表格选项中设置COLLATE utf8_unicode_ci 不会自动为groupName 列设置它?
  • @Barmar 我希望我添加的底部块说明了这个问题。该块的标题是“您的原件的更多细节”。
  • 你知道为什么它忽略了最后一行的COLLATE=utf8_unicode_ci吗?这不应该为没有自己的COLLATE 选项的任何列设置默认排序规则吗?
  • @Barmar 这就是为什么 image 来自手册页 here
  • 啊,原来是因为他为列指定了CHARACTER SET,所以它使用字符集的默认排序规则,而不是表的默认排序规则。所以另一种解决方案是从列中删除CHARACTER SET utf8,因为这是表默认值。
【解决方案2】:

propType 默认为 NULL,但 groupName 不能为 NULL。这可能是您的问题。

`propType` varchar(45) COLLATE utf8_unicode_ci DEFAULT NULL

`groupName` varchar(45) CHARACTER SET utf8 NOT NULL

但我可能错了。尝试查看这些准则并确保您的 FK 约束遵循所有这些准则:

  1. 两个表都必须是 InnoDB 类型。
  2. 在被引用的表中,必须有一个索引,其中被引用的列按相同顺序列为第一列。
  3. 不支持外键列的索引前缀。
  4. InnoDB 需要外键和引用键的索引,以便外键检查可以快速且不需要表扫描。
  5. 两个关键字段必须具有兼容的字段类型。
  6. 整数类型的大小和符号必须相同。
  7. 字符串类型的长度不必相同。
  8. 外键名在数据库中必须是唯一的
  9. 如果您指定 SET NULL 操作,请确保您没有将子表中的列声明为 NOT NULL。

(来自这里:http://wiki.navicat.com/wiki/index.php/Why_I_cannot_successfully_create_the_foreign_keys%3F

【讨论】:

  • 即使 Table1 的 propType 也没有空值,它也没有用
  • 那么在列表中一定有你的 FK 约束不遵守的其他东西。稍后,当我可以自己尝试这些表创建脚本时,如果其他人没有提供解决方案,我可能会为您提供帮助。 :)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多