【问题标题】:Can't create a mysql table: foreign key constraint issue无法创建 mysql 表:外键约束问题
【发布时间】:2019-07-01 19:12:53
【问题描述】:

我删除了一个 sql 表(没有进行键约束检查),现在我无法从 sql 查询重新生成或再次导入。

创作查询:

SET SQL_MODE = "NO_AUTO_VALUE_ON_ZERO";
SET AUTOCOMMIT = 0;
START TRANSACTION;
SET time_zone = "+00:00";

/*!40101 SET @OLD_CHARACTER_SET_CLIENT=@@CHARACTER_SET_CLIENT */;
/*!40101 SET @OLD_CHARACTER_SET_RESULTS=@@CHARACTER_SET_RESULTS */;
/*!40101 SET @OLD_COLLATION_CONNECTION=@@COLLATION_CONNECTION */;
/*!40101 SET NAMES utf8mb4 */;

CREATE TABLE `customer_entity` (
  `entity_id` int(10) UNSIGNED NOT NULL COMMENT 'Entity Id',
  `website_id` smallint(5) UNSIGNED DEFAULT NULL COMMENT 'Website Id',
  `email` varchar(255) DEFAULT NULL COMMENT 'Email',
  `group_id` smallint(5) UNSIGNED NOT NULL DEFAULT '0' COMMENT 'Group Id',
  `increment_id` varchar(50) DEFAULT NULL COMMENT 'Increment Id',
  `store_id` smallint(5) UNSIGNED DEFAULT '0' COMMENT 'Store Id',
  `created_at` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT 'Created At',
  `updated_at` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT 'Updated At',
  `is_active` smallint(5) UNSIGNED NOT NULL DEFAULT '1' COMMENT 'Is Active',
  `disable_auto_group_change` smallint(5) UNSIGNED NOT NULL DEFAULT '0' COMMENT 'Disable automatic group change based on VAT ID',
  `created_in` varchar(255) DEFAULT NULL COMMENT 'Created From',
  `prefix` varchar(40) DEFAULT NULL COMMENT 'Prefix',
  `firstname` varchar(255) DEFAULT NULL COMMENT 'First Name',
  `middlename` varchar(255) DEFAULT NULL COMMENT 'Middle Name/Initial',
  `lastname` varchar(255) DEFAULT NULL COMMENT 'Last Name',
  `suffix` varchar(40) DEFAULT NULL COMMENT 'Suffix',
  `dob` date DEFAULT NULL COMMENT 'Date of Birth',
  `password_hash` varchar(128) DEFAULT NULL COMMENT 'Password_hash',
  `rp_token` varchar(128) DEFAULT NULL COMMENT 'Reset password token',
  `rp_token_created_at` datetime DEFAULT NULL COMMENT 'Reset password token creation time',
  `default_billing` int(10) UNSIGNED DEFAULT NULL COMMENT 'Default Billing Address',
  `default_shipping` int(10) UNSIGNED DEFAULT NULL COMMENT 'Default Shipping Address',
  `taxvat` varchar(50) DEFAULT NULL COMMENT 'Tax/VAT Number',
  `confirmation` varchar(64) DEFAULT NULL COMMENT 'Is Confirmed',
  `gender` smallint(5) UNSIGNED DEFAULT NULL COMMENT 'Gender',
  `failures_num` smallint(6) DEFAULT '0' COMMENT 'Failure Number',
  `first_failure` timestamp NULL DEFAULT NULL COMMENT 'First Failure',
  `lock_expires` timestamp NULL DEFAULT NULL COMMENT 'Lock Expiration Date'
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COMMENT='Customer Entity';

ALTER TABLE `customer_entity`
  ADD PRIMARY KEY (`entity_id`),
  ADD UNIQUE KEY `CUSTOMER_ENTITY_EMAIL_WEBSITE_ID` (`email`,`website_id`),
  ADD KEY `CUSTOMER_ENTITY_STORE_ID` (`store_id`),
  ADD KEY `CUSTOMER_ENTITY_WEBSITE_ID` (`website_id`),
  ADD KEY `CUSTOMER_ENTITY_FIRSTNAME` (`firstname`),
  ADD KEY `CUSTOMER_ENTITY_LASTNAME` (`lastname`);


ALTER TABLE `customer_entity`
  MODIFY `entity_id` int(10) UNSIGNED NOT NULL AUTO_INCREMENT COMMENT 'Entity Id';


ALTER TABLE `customer_entity`
  ADD CONSTRAINT `CUSTOMER_ENTITY_STORE_ID_STORE_STORE_ID` FOREIGN KEY (`store_id`) REFERENCES `store` (`store_id`) ON DELETE SET NULL,
  ADD CONSTRAINT `CUSTOMER_ENTITY_WEBSITE_ID_STORE_WEBSITE_WEBSITE_ID` FOREIGN KEY (`website_id`) REFERENCES `store_website` (`website_id`) ON DELETE SET NULL;
COMMIT;

/*!40101 SET CHARACTER_SET_CLIENT=@OLD_CHARACTER_SET_CLIENT */;
/*!40101 SET CHARACTER_SET_RESULTS=@OLD_CHARACTER_SET_RESULTS */;
/*!40101 SET COLLATION_CONNECTION=@OLD_COLLATION_CONNECTION */;

错误捕获:

#1215 - 无法添加参照完整性约束(外部键约束)

我也尝试使用SET FOREIGN_KEY_CHECKS = 0;,但没有成功。 我尝试再次导入 sql 表但没有成功。 在创建查询中没有关键的外部约束,所以我无法弄清楚为什么查询会产生错误。

该表在 Magento 2 数据库上称为“customer_entity.sql”。

【问题讨论】:

  • 检查SHOW ENGINE INNODB STATUS,它将包含有关最近外键错误的更多详细信息。比如哪个表,具体的约束不起作用等等。
  • 这看起来很可疑,因为该表没有 PRIMARY KEY 并且根本没有索引。那真的是 Magento 表吗?这很不寻常,可能值得关注。
  • 这是从 mysql ( sql table export ) 进行的查询。我删除了所有关键约束定义以检查是否可以通过这种方式解决问题。我不知道为什么没有主键,也许我也删除了主键定义。
  • 您是否还删除了一些FOREIGN KEY 定义?请理解,当您提供的代码与显示错误的代码大不相同时,很难为您提供帮助。
  • 我用完整的查询编辑

标签: mysql sql database constraints magento2


【解决方案1】:

我找到了解决问题的方法。

我更改了我的创建查询,我将表从“customer_entity”重命名为“customer_entity2”。

CREATE TABLE `customer_entity2` (
/* ..etc */

ALTER TABLE `customer_entity2`
/* ..etc */

因此,当我运行创建查询时,mysql 不会检查所有键约束。 然后我将表重命名为“customer_entity”,技巧就完成了。

这是一个太简单的解决方案,但我在一分钟前完成了它,它工作正常。 谢谢大家

【讨论】:

    【解决方案2】:

    外键约束是否在另一张表上?如果是这样,您可以尝试删除它,创建此表,然后重新添加约束。

    【讨论】:

    • 可能对其他表有一些键约束,但错误不会通知哪些表。在 Magento 中,很多表都与外键链接,所以我更喜欢只能加载表的解决方案。
    猜你喜欢
    • 2014-02-26
    • 1970-01-01
    • 2018-05-01
    • 1970-01-01
    • 2013-05-04
    • 1970-01-01
    • 2010-12-07
    相关资源
    最近更新 更多