ошибка при импорте таблицы: неверно сформировано ограничение ключа

0

поэтому я работаю над веб-сайтом, я внес некоторые изменения в одну из таблиц на моем локальном хосте, поэтому, естественно, я хочу заменить эту таблицу на реальном сервере

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

-- phpMyAdmin SQL Dump
-- version 4.6.4
-- https://www.phpmyadmin.net/
--
-- Host: 127.0.0.1
-- Generation Time: Jan 17, 2018 at 06:28 PM
-- Server version: 5.7.14
-- PHP Version: 7.0.10

SET SQL_MODE = "NO_AUTO_VALUE_ON_ZERO";
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 */;

--
-- Database: 'skywin_mock'
--

-- --------------------------------------------------------

--
-- Table structure for table 'lottery_winners'
--

CREATE TABLE 'lottery_winners' (
  'id' int(10) UNSIGNED NOT NULL,
  'user_id' int(10) UNSIGNED NOT NULL,
  'lottery_id' int(10) UNSIGNED NOT NULL,
  'credit' int(11) NOT NULL,
  'amount' int(11) NOT NULL,
  'rew_type' char(20) COLLATE utf8mb4_unicode_ci NOT NULL,
  'created_at' timestamp NULL DEFAULT NULL,
  'updated_at' timestamp NULL DEFAULT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;

--
-- Indexes for dumped tables
--

--
-- Indexes for table 'lottery_winners'
--
ALTER TABLE 'lottery_winners'
  ADD PRIMARY KEY ('id'),
  ADD UNIQUE KEY 'lottery_winners_user_id_lottery_id_unique' ('user_id','lottery_id'),
  ADD KEY 'lottery_winners_lottery_id_foreign' ('lottery_id');

--
-- AUTO_INCREMENT for dumped tables
--

--
-- AUTO_INCREMENT for table 'lottery_winners'
--
ALTER TABLE 'lottery_winners'
  MODIFY 'id' int(10) UNSIGNED NOT NULL AUTO_INCREMENT;
--
-- Constraints for dumped tables
--

--
-- Constraints for table 'lottery_winners'
--
ALTER TABLE 'lottery_winners'
  ADD CONSTRAINT 'lottery_winners_lottery_id_foreign' FOREIGN KEY ('lottery_id') REFERENCES 'lotteries' ('id'),
  ADD CONSTRAINT 'lottery_winners_user_id_foreign' FOREIGN KEY ('user_id') REFERENCES 'users' ('id');

/*!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 */;

но я продолжаю получать эту ошибку

SQL query:

--
-- Database: 'skywin_mock'
--

-- --------------------------------------------------------

--
-- Table structure for table 'lottery_winners'
--

CREATE TABLE 'lottery_winners' (
  'id' int(10) UNSIGNED NOT NULL,
  'user_id' int(10) UNSIGNED NOT NULL,
  'lottery_id' int(10) UNSIGNED NOT NULL,
  'credit' int(11) NOT NULL,
  'amount' int(11) NOT NULL,
  'rew_type' char(20) COLLATE utf8mb4_unicode_ci NOT NULL,
  'created_at' timestamp NULL DEFAULT NULL,
  'updated_at' timestamp NULL DEFAULT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci

MySQL said: Documentation
#1005 - Can't create table 'database'.'lottery_winners' (errno: 150 "Foreign key constraint is incorrectly formed") (Details…)

есть два знаковых ключа в коде, который их таблица существует на реальном сервере

вот сумма фиктивный текст becuz SO не позволяет мне опубликовать этот вопрос без каких-либо подробностей.... но я думаю, его довольно ясно, что проблема

  • 0
    Возможно, у вас есть какой-то внешний ключ, указывающий на эту таблицу. Если вы воссоздаете эту таблицу, у нее должен быть индекс по указанному столбцу в момент ее создания. Так что либо удалите внешний ключ и заново создайте его, если позже, либо добавьте индекс (возможно, lottery_winners_lottery_id_foreign , возможно, первичный ключ) непосредственно с таблицей, а не с alter table впоследствии.
  • 0
    @Solarflare, спасибо, как вы сказали, что есть еще несколько таблиц, указывающих на lottery_winners .. просьба опубликовать ваше предложение в качестве ответа, чтобы я мог выбрать его
Теги:

1 ответ

0
Лучший ответ

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

При воссоздании таблицы, которая была удалена, возвращается ошибка, если определение таблицы не соответствует ограничениям внешнего ключа, ссылающимся на таблицу.

Это включает в себя, что любой индекс, который требуется для работы этих внешних ключей, должен существовать в определении таблицы.

Поэтому добавьте индексы (или, по крайней мере, тот, который вам нужен для внешнего ключа), непосредственно к определению таблицы, а не к следующему утверждению:

CREATE TABLE 'lottery_winners' (
   ... ,
   PRIMARY KEY ('id'),
   UNIQUE KEY 'lottery_winners_user_id_lottery_id_unique' ('user_id','lottery_id'),
   KEY 'lottery_winners_lottery_id_foreign' ('lottery_id')
) ENGINE=...

(Конечно, вы также можете добавить два внешних ключа к users и lotteries и, конечно же, установить id для auto_increment).

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

Установка foreign_key_checks в 1 не вызывает проверку существующих данных таблицы. Поэтому строки, добавленные в таблицу, а foreign_key_checks = 0 не будут проверяться на согласованность.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню