错误:1005无法添加外键(错误:121写入或更新Duplate键)

时间:2017-10-27 12:10:50

标签: mysql foreign-keys mariadb

每当我尝试在magento中重新索引表时,它会尝试创建一个外键。那不是问题。然而,我得到的错误是。 Reindexing magento 1.9.x 查看Mysql会出现以下错误:

Error in foreign key constraint creation for table `admin_staging`.`#sql-5f81_690`.
A foreign key constraint of name `admin_staging`.`FK_CAT_PRD_FLAT_1_ENTT_ID_CAT_PRD_ENTT_ENTT_ID`
already exists. (Note that internally InnoDB adds 'databasename'
in front of the user-defined constraint name.)
Note that InnoDB's FOREIGN KEY system tables store
constraint names as case-insensitive, with the
MySQL standard latin1_swedish_ci collation. If you
create tables or databases whose names differ only in
the character case, then collisions in constraint
names can occur. Workaround: name your constraints
explicitly with unique names.

当我想知道系统中的外键时,它可以找到ALOT。但不是应该存在的那个。当我执行以下SQL时,它也返回none。

SELECT
    *
FROM
    INFORMATION_SCHEMA.TABLE_CONSTRAINTS
WHERE
    CONSTRAINT_TYPE = 'FOREIGN KEY' AND CONSTRAINT_NAME = 'FK_CAT_PRD_FLAT_1_ENTT_ID_CAT_PRD_ENTT_ENTT_ID'

PS。还手动使外键不起作用:

ALTER TABLE `catalog_product_flat_1` ADD CONSTRAINT `FK_CAT_PRD_FLAT_1_ENTT_ID_CAT_PRD_ENTT_ENTT_ID_TEST` FOREIGN KEY(`entity_id`) REFERENCES `catalog_product_entity`(`entity_id`) ON DELETE CASCADE ON UPDATE CASCADE

我不知道接下来要做什么/检查? PS。我希望这不是一个重复的问题,因为我阅读了大部分内容。

更新
我试图重启mysql服务器。之后我可以添加外键。 所以我试图运行索引器..没有成功:(仍然是相同的错误。它成功删除外键但似乎无法再次添加它。 也重新启动,并没有手动添加外键。然后也得到了错误。 真的以为这是一个mysql错误。

UPDATE2 正如SHOW CREATE TABLE

所述
CREATE TABLE `catalog_product_flat_1` (
 `entity_id` int(10) unsigned NOT NULL COMMENT 'Entity Id',
 `attribute_set_id` smallint(5) unsigned NOT NULL DEFAULT 0 COMMENT 'Attribute Set Id',
 `type_id` varchar(32) NOT NULL DEFAULT 'simple' COMMENT 'Type Id',
 `cost` decimal(12,4) DEFAULT NULL COMMENT 'Cost',
 `created_at` timestamp NULL DEFAULT NULL COMMENT 'Created At',
 `gift_message_available` smallint(6) DEFAULT NULL COMMENT 'Gift Message Available',
 `has_options` smallint(6) NOT NULL DEFAULT 0 COMMENT 'Has Options',
 `image_label` varchar(255) DEFAULT NULL COMMENT 'Image Label',
 `is_recurring` smallint(6) DEFAULT NULL COMMENT 'Is Recurring',
 `links_exist` int(11) DEFAULT NULL COMMENT 'Links Exist',
 `links_purchased_separately` int(11) DEFAULT NULL COMMENT 'Links Purchased Separately',
 `links_title` varchar(255) DEFAULT NULL COMMENT 'Links Title',
 `msrp` decimal(12,4) DEFAULT NULL COMMENT 'Msrp',
 `msrp_display_actual_price_type` varchar(255) DEFAULT NULL COMMENT 'Msrp Display Actual Price Type',
 `msrp_enabled` smallint(6) DEFAULT NULL COMMENT 'Msrp Enabled',
 `name` varchar(255) DEFAULT NULL COMMENT 'Name',
 `news_from_date` datetime DEFAULT NULL COMMENT 'News From Date',
 `news_to_date` datetime DEFAULT NULL COMMENT 'News To Date',
 `price` decimal(12,4) DEFAULT NULL COMMENT 'Price',
 `price_type` int(11) DEFAULT NULL COMMENT 'Price Type',
 `price_view` int(11) DEFAULT NULL COMMENT 'Price View',
 `recurring_profile` text DEFAULT NULL COMMENT 'Recurring Profile',
 `required_options` smallint(5) unsigned NOT NULL DEFAULT 0 COMMENT 'Required Options',
 `shipment_type` int(11) DEFAULT NULL COMMENT 'Shipment Type',
 `short_description` text DEFAULT NULL COMMENT 'Short Description',
 `sku` varchar(64) DEFAULT NULL COMMENT 'Sku',
 `sku_type` int(11) DEFAULT NULL COMMENT 'Sku Type',
 `small_image` varchar(255) DEFAULT NULL COMMENT 'Small Image',
 `small_image_label` varchar(255) DEFAULT NULL COMMENT 'Small Image Label',
 `special_from_date` datetime DEFAULT NULL COMMENT 'Special From Date',
 `special_price` decimal(12,4) DEFAULT NULL COMMENT 'Special Price',
 `special_to_date` datetime DEFAULT NULL COMMENT 'Special To Date',
 `tax_class_id` int(10) unsigned DEFAULT NULL COMMENT 'Tax Class Id',
 `thumbnail` varchar(255) DEFAULT NULL COMMENT 'Thumbnail',
 `thumbnail_label` varchar(255) DEFAULT NULL COMMENT 'Thumbnail Label',
 `updated_at` timestamp NULL DEFAULT NULL COMMENT 'Updated At',
 `url_key` varchar(255) DEFAULT NULL COMMENT 'Url Key',
 `url_path` varchar(255) DEFAULT NULL COMMENT 'Url Path',
 `visibility` smallint(5) unsigned DEFAULT NULL COMMENT 'Visibility',
 `weight` decimal(12,4) DEFAULT NULL COMMENT 'Weight',
 `weight_type` int(11) DEFAULT NULL COMMENT 'Weight Type',
 `manufacturer_sku` varchar(255) DEFAULT NULL COMMENT 'Manufacturer Sku',
 `width` varchar(255) DEFAULT NULL COMMENT 'Width',
 `depth` varchar(255) DEFAULT NULL COMMENT 'Depth',
 `height` varchar(255) DEFAULT NULL COMMENT 'Height',
 `stock` int(11) DEFAULT NULL COMMENT 'Stock',
 `stock_value` varchar(255) DEFAULT NULL COMMENT 'Stock Value',
 `status` smallint(5) unsigned DEFAULT NULL COMMENT 'Status',
 PRIMARY KEY (`entity_id`),
 KEY `IDX_CATALOG_PRODUCT_FLAT_1_TYPE_ID` (`type_id`),
 KEY `IDX_CATALOG_PRODUCT_FLAT_1_ATTRIBUTE_SET_ID` (`attribute_set_id`),
 KEY `IDX_CATALOG_PRODUCT_FLAT_1_NAME` (`name`),
 KEY `IDX_CATALOG_PRODUCT_FLAT_1_PRICE` (`price`),
 KEY `IDX_CATALOG_PRODUCT_FLAT_1_CREATED_AT` (`created_at`),
 KEY `IDX_CATALOG_PRODUCT_FLAT_1_STOCK` (`stock`),
 KEY `IDX_CATALOG_PRODUCT_FLAT_1_STOCK_VALUE` (`stock_value`),
 KEY `IDX_CATALOG_PRODUCT_FLAT_1_STATUS` (`status`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COMMENT='Catalog Product Flat (Store 1)'

-

CREATE TABLE `catalog_product_entity` (
 `entity_id` int(10) unsigned NOT NULL AUTO_INCREMENT COMMENT 'Entity ID',
 `entity_type_id` smallint(5) unsigned NOT NULL DEFAULT 0 COMMENT 'Entity Type ID',
 `attribute_set_id` smallint(5) unsigned NOT NULL DEFAULT 0 COMMENT 'Attribute Set ID',
 `type_id` varchar(32) NOT NULL DEFAULT 'simple' COMMENT 'Type ID',
 `sku` varchar(64) DEFAULT NULL COMMENT 'SKU',
 `has_options` smallint(6) NOT NULL DEFAULT 0 COMMENT 'Has Options',
 `required_options` smallint(5) unsigned NOT NULL DEFAULT 0 COMMENT 'Required Options',
 `created_at` timestamp NULL DEFAULT NULL COMMENT 'Creation Time',
 `updated_at` timestamp NULL DEFAULT NULL COMMENT 'Update Time',
 PRIMARY KEY (`entity_id`),
 KEY `IDX_CATALOG_PRODUCT_ENTITY_ENTITY_TYPE_ID` (`entity_type_id`),
 KEY `IDX_CATALOG_PRODUCT_ENTITY_ATTRIBUTE_SET_ID` (`attribute_set_id`),
 KEY `IDX_CATALOG_PRODUCT_ENTITY_SKU` (`sku`),
 CONSTRAINT `FK_CAT_PRD_ENTT_ATTR_SET_ID_EAV_ATTR_SET_ATTR_SET_ID` FOREIGN KEY (`attribute_set_id`) REFERENCES `eav_attribute_set` (`attribute_set_id`) ON DELETE CASCADE ON UPDATE CASCADE,
 CONSTRAINT `FK_CAT_PRD_ENTT_ENTT_TYPE_ID_EAV_ENTT_TYPE_ENTT_TYPE_ID` FOREIGN KEY (`entity_type_id`) REFERENCES `eav_entity_type` (`entity_type_id`) ON DELETE CASCADE ON UPDATE CASCADE
) ENGINE=InnoDB AUTO_INCREMENT=111152 DEFAULT CHARSET=utf8 COMMENT='Catalog Product Table'

3 个答案:

答案 0 :(得分:1)

(渴望评论;到目前为止主要是调试信息......)

我将问题简化为

CREATE TABLE so729_flat (
  entity_id INT UNSIGNED NOT NULL,
  PRIMARY KEY(entity_id)
);

CREATE TABLE so729_cpe (
  entity_id INT UNSIGNED NOT NULL,
  PRIMARY KEY(entity_id)
);

ALTER TABLE `so729_flat`
    ADD CONSTRAINT  FOREIGN KEY(`entity_id`)
        REFERENCES `so729_cpe`(`entity_id`)
        ON DELETE CASCADE ON UPDATE CASCADE;

它工作正常。运行ALTER两次后,我得到:

SHOW CREATE TABLE so729_flat \G

CREATE TABLE `so729_flat` (
  `entity_id` int(10) unsigned NOT NULL,
  PRIMARY KEY (`entity_id`),
  CONSTRAINT `so729_flat_ibfk_1` FOREIGN KEY (`entity_id`) REFERENCES `so729_cpe` (`entity_id`) ON DELETE CASCADE ON UPDATE CASCADE,
  CONSTRAINT `so729_flat_ibfk_2` FOREIGN KEY (`entity_id`) REFERENCES `so729_cpe` (`entity_id`) ON DELETE CASCADE ON UPDATE CASCADE
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_520_ci

(包括两个FK - 没用)。

您是否可以尝试简化用例以继续演示问题?或者增强我的例子直到失败?也许在这个过程中你可以发现问题。或者至少可以确定触发问题的原因。

哦,提供文字,而不是图片。

答案 1 :(得分:0)

我不知道CONSTRAINT_TYPE是否是INFORMATION_SCHEMA.TABLE_CONSTRAINTS的主键的一部分,或者该表是否在CONSTRAINT_NAME上有另一个唯一的键约束。

但您可以在没有CONSTRAINT_TYPE的情况下尝试在INFORMATION_SCHEMA.TABLE_CONSTRAINTS上进行查询。

答案 2 :(得分:0)

看来原始消息是关于它无法创建FK,因为由于某种原因,相关表中的字段entity_id不是唯一的。 你应该试试

abs()

也可以在catalog_product_flat_1表上试一下,看看是否删除了任何表格中的重复记录。