Не удается создать таблицу mysql: проблема с ограничением внешнего ключа

Я удалил таблицу 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, но безуспешно. В запросе на создание нет ключевых внешних ограничений, поэтому я не могу понять, почему запрос генерирует ошибку.

Таблица называется «customer_entity.sql» в базе данных Magento 2.

Проверьте SHOW ENGINE INNODB STATUS, он будет содержать более подробную информацию о самой последней ошибке внешнего ключа. Например, какая таблица, конкретное ограничение, которое не сработало, и т. д.

Bill Karwin 07.02.2019 17:20

Выглядит подозрительно, что в таблице нет PRIMARY KEY и вообще нет индексов. Это действительно таблица Magento? Это необычно и, вероятно, вызывает беспокойство.

Bill Karwin 07.02.2019 17:24

это запрос, сделанный из mysql (экспорт таблицы sql). я удалил все определения ключевых ограничений, чтобы проверить, можно ли решить проблему таким образом. Я не знаю, почему нет первичного ключа, может быть, я также удаляю определение первичного ключа.

Alfredo Lanzetta 07.02.2019 19:14

Вы также удалили некоторые определения FOREIGN KEY? Пожалуйста, поймите, что очень сложно вам помочь, когда вы представляете код, который существенно отличается от кода, в котором обнаружена ошибка.

Bill Karwin 07.02.2019 19:47

Я редактирую полный запрос

Alfredo Lanzetta 08.02.2019 08:19
Освоение архитектуры микросервисов с Laravel: Лучшие практики, преимущества и советы для разработчиков
Освоение архитектуры микросервисов с Laravel: Лучшие практики, преимущества и советы для разработчиков
В последние годы архитектура микросервисов приобрела популярность как способ построения масштабируемых и гибких приложений. Laravel , популярный PHP...
Как построить CRUD-приложение в Laravel
Как построить CRUD-приложение в Laravel
Laravel - это популярный PHP-фреймворк, который позволяет быстро и легко создавать веб-приложения. Одной из наиболее распространенных задач в...
Освоение PHP и управление базами данных: Создание собственной СУБД - часть II
Освоение PHP и управление базами данных: Создание собственной СУБД - часть II
В предыдущем посте мы создали функциональность вставки и чтения для нашей динамической СУБД. В этом посте мы собираемся реализовать функции обновления...
Документирование API с помощью Swagger на Springboot
Документирование API с помощью Swagger на Springboot
В предыдущей статье мы уже узнали, как создать Rest API с помощью Springboot и MySql .
Роли и разрешения пользователей без пакета Laravel 9
Роли и разрешения пользователей без пакета Laravel 9
Этот пост изначально был опубликован на techsolutionstuff.com .
Как установить LAMP Stack - Security 5/5 на виртуальную машину Azure Linux VM
Как установить LAMP Stack - Security 5/5 на виртуальную машину Azure Linux VM
В предыдущей статье мы завершили установку базы данных, для тех, кто не знает.
1
5
508
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Является ли ограничение внешнего ключа для другой таблицы? Если это так, вы можете попробовать удалить его, создать эту таблицу, а затем снова добавить ограничение.

возможно, есть некоторые ключевые ограничения для других таблиц, но ошибка не уведомляет, какие таблицы. В Magento многие таблицы связаны с внешним ключом, поэтому я предпочитаю решение, в котором я могу загрузить только таблицу.

Alfredo Lanzetta 07.02.2019 17:19
Ответ принят как подходящий

Я нашел решение своей проблемы.

Я изменил свой запрос на создание, я переименовал таблицу с «customer_entity» на «customer_entity2».

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

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

Поэтому, когда я запускаю запрос на создание, mysql не проверяет все ключевые ограничения. Затем я переименовываю таблицу в «customer_entity», и дело сделано.

Это слишком простое решение, но я сделал это минуту назад, и оно отлично работает. Спасибо вам всем

Другие вопросы по теме