【问题标题】:MySQL 5.5 add foreign key fails with errors [HY000][150] and [HY000][1005]MySQL 5.5 添加外键失败并出现错误 [HY000][150] 和 [HY000][1005]
【发布时间】:2012-01-01 15:38:01
【问题描述】:

我尝试过添加这样的外键...

ALTER TABLE OrderLineItem
ADD CONSTRAINT
        FK_OrderLineItem_ShippingType_name FOREIGN KEY
(shippingType)
REFERENCES ShippingType(name);

或者在Mysql 5.5中这样...

alter table OrderLineItem add foreign key 
FK_OrderLineItem_ShippingType (shippingType) references ShippingType(name);

每次看到以下错误。

[2011-11-18 15:07:04] [HY000][150] 创建表 带有外键约束的“realtorprint_dev_dev/#sql-7d0_80”失败。 被引用的表中没有被引用列的索引 显示为第一列。

[2011-11-18 15:07:04] [HY000][1005] 无法创建表 'realtorprint_dev_dev.#sql-7d0_80' (errno: 150)

OrderLineItem.shippingType 和 ShippingType.name 的类型均为 varchar(50),不为空。 ShippingType.name 是 ShippingType 的主键。

这是在 ShippingType 和 OrderLineItem 上显示创建表的结果...

CREATE TABLE `shippingtype` (
  `name` varchar(50) CHARACTER SET latin1 NOT NULL DEFAULT '',
  `description` varchar(255) CHARACTER SET latin1 NOT NULL,
  PRIMARY KEY (`name`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

CREATE TABLE `orderlineitem` (
  `id` bigint(20) NOT NULL AUTO_INCREMENT,
  `description` varchar(255) CHARACTER SET latin1 NOT NULL,
  `lineNumber` int(11) NOT NULL,
  `quantity` int(11) NOT NULL,
  `quantityMultiplier` int(11) NOT NULL,
  `unitPrice` decimal(10,2) NOT NULL,
  `order_id` bigint(20) NOT NULL,
  `productDefinition_id` bigint(20) NOT NULL,
  `mlsId` varchar(255) CHARACTER SET latin1 DEFAULT NULL,
  `printProviderUnitCost` decimal(10,2) NOT NULL,
  `shippingType` varchar(50) NOT NULL,
  `address` varchar(255) DEFAULT NULL,
  `zipPostal` varchar(255) NOT NULL,
  `city` varchar(255) NOT NULL,
  `stateProvince` varchar(255) NOT NULL,
  `country` varchar(255) DEFAULT NULL,
  PRIMARY KEY (`id`),
  KEY `idx_OrderLineItem_productDefinition_id` (`productDefinition_id`),
  KEY `idx_OrderLineItem_order_id` (`order_id`),
  CONSTRAINT `FK_OrderLineItem_order_id` FOREIGN KEY (`order_id`) REFERENCES `userorder` (`id`),
  CONSTRAINT `FK_OrderLineItem_productDefinition_id` FOREIGN KEY (`productDefinition_id`) REFERENCES `productdefinition` (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=10029 DEFAULT CHARSET=utf8;

【问题讨论】:

  • 我错过了关于它是主键的一点。让我检查一下
  • 对我有用 - 两个表中的列类型是否完全相同?当存在轻微的类型不匹配(排序规则等)时,我已经看到了这一点
  • 哇,看来你是对的。
  • 酷 - 我更新了我的答案以包括 - 我花了几个小时在 mysql 中查看这个 :-) 这就是我记得的原因。

标签: mysql foreign-keys dml


【解决方案1】:

当列类型不完全匹配时,Mysql 可能会给出这个错误 - 检查排序规则/大小等。

【讨论】:

  • 这是真的!该死的“未签名”在“创建表”语句中!谢谢!
  • 不要以为错误说明不了问题,我认为这是一种糟糕的编程风格!
【解决方案2】:

orderLineItem.shippingType 具有字符集 utf8,但 ShippingType.name 具有字符集 latin1。这些与外键引用的目的不兼容。

【讨论】:

  • 我们在不同的列排序规则中遇到了同样的错误。您可以使用 SHOW FULL COLUMNS FROM tableName 检查参考表列排序规则;
【解决方案3】:

数据类型不匹配或未在基于引用的表上正确声明 PK。

【讨论】:

    猜你喜欢
    • 2020-08-07
    • 2018-10-04
    • 2011-09-02
    • 2013-12-25
    • 2011-02-17
    • 2021-06-11
    • 2017-04-09
    • 2016-10-12
    • 1970-01-01
    相关资源
    最近更新 更多