我正在使用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`)
答案 0 :(得分:3)
从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:
如果指定了CHARACTER SET X而没有COLLATE,则字符集X和 使用默认排序规则。
CREATE TABLE t1 ( col1 CHAR(10) CHARACTER SET utf8 ) CHARACTER SET latin1 COLLATE latin1_bin;
为列指定了字符集,但排序规则是 不。该列具有字符集utf8和默认排序规则 utf8,这是utf8_general_ci。要查看每个的默认排序规则 字符集,使用SHOW COLLATION语句。
答案 1 :(得分:1)
propType默认为NULL,但groupName不能为NULL。这可能是你的问题。
`propType` varchar(45) COLLATE utf8_unicode_ci DEFAULT NULL
`groupName` varchar(45) CHARACTER SET utf8 NOT NULL
但我可能错了。尝试查看这些指南并确保您的FK约束遵循所有这些:
(从这里:http://wiki.navicat.com/wiki/index.php/Why_I_cannot_successfully_create_the_foreign_keys%3F)