Сбой ограничения внешнего ключа mysql при отключении

0

У меня возникла проблема с восстановлением данных в DB mysql с дампа. Я запускаю ту же версию mysql, я отключил проверки внешнего ключа, и типы данных те же, но я не могу понять, почему проверка не выполняется

Error in foreign key constraint of table staging/bookmarks:
 FOREIGN KEY ('user_id') REFERENCES 'users' ('id') ON DELETE CASCADE ON UPDATE CASCADE,
  CONSTRAINT 'bookmarks_video_id_foreign' FOREIGN KEY ('video_id') REFERENCES 'videos' ('id') ON DELETE CASCADE ON UPDATE CASCADE
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci:
Cannot find an index in the referenced table where the
referenced columns appear as the first columns, or column types
in the table and the referenced table do not match for constraint.

схема таблицы

-- Server version   5.6.34-log

/*!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 utf8 */;
/*!40103 SET @OLD_TIME_ZONE=@@TIME_ZONE */;
/*!40103 SET TIME_ZONE='+00:00' */;
/*!40014 SET @OLD_UNIQUE_CHECKS=@@UNIQUE_CHECKS, UNIQUE_CHECKS=0 */;
/*!40014 SET @OLD_FOREIGN_KEY_CHECKS=@@FOREIGN_KEY_CHECKS, FOREIGN_KEY_CHECKS=0 */;
/*!40101 SET @OLD_SQL_MODE=@@SQL_MODE, SQL_MODE='NO_AUTO_VALUE_ON_ZERO' */;
/*!40111 SET @OLD_SQL_NOTES=@@SQL_NOTES, SQL_NOTES=0 */;

...

--
-- Table structure for table 'bookmarks'
--

DROP TABLE IF EXISTS 'bookmarks';
/*!40101 SET @saved_cs_client     = @@character_set_client */;
/*!40101 SET character_set_client = utf8 */;
CREATE TABLE 'bookmarks' (
  'id' varchar(36) COLLATE utf8_unicode_ci NOT NULL,
  'user_id' varchar(36) COLLATE utf8_unicode_ci NOT NULL,
  'video_id' varchar(36) COLLATE utf8_unicode_ci NOT NULL,
  'course_id' varchar(36) COLLATE utf8_unicode_ci NOT NULL,
  'time' int(11) NOT NULL,
  'title' varchar(255) COLLATE utf8_unicode_ci DEFAULT NULL,
  'created_at' timestamp NOT NULL DEFAULT '0000-00-00 00:00:00',
  'updated_at' timestamp NOT NULL DEFAULT '0000-00-00 00:00:00',
  'deleted_at' timestamp NULL DEFAULT NULL,
  'notes' text COLLATE utf8_unicode_ci,
  PRIMARY KEY ('id'),
  UNIQUE KEY 'bookmarks_course_id_user_id_video_id_time_unique' ('course_id','user_id','video_id','time'),
  KEY 'bookmarks_user_id_foreign' ('user_id'),
  KEY 'bookmarks_video_id_foreign' ('video_id'),
  CONSTRAINT 'bookmarks_course_id_foreign' FOREIGN KEY ('course_id') REFERENCES 'courses' ('id') ON DELETE CASCADE ON UPDATE CASCADE,
  CONSTRAINT 'bookmarks_user_id_foreign' FOREIGN KEY ('user_id') REFERENCES 'users' ('id') ON DELETE CASCADE ON UPDATE CASCADE,
  CONSTRAINT 'bookmarks_video_id_foreign' FOREIGN KEY ('video_id') REFERENCES 'videos' ('id') ON DELETE CASCADE ON UPDATE CASCADE
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci;
/*!40101 SET character_set_client = @saved_cs_client */;


...


--
-- Table structure for table 'users'
--

DROP TABLE IF EXISTS 'users';
/*!40101 SET @saved_cs_client     = @@character_set_client */;
/*!40101 SET character_set_client = utf8 */;
CREATE TABLE 'users' (
  'id' varchar(36) COLLATE utf8_unicode_ci NOT NULL,
  'username' varchar(63) COLLATE utf8_unicode_ci DEFAULT NULL,
  'password' varchar(60) COLLATE utf8_unicode_ci DEFAULT NULL,
  'email' varchar(63) COLLATE utf8_unicode_ci NOT NULL,
  'role_id' varchar(36) COLLATE utf8_unicode_ci DEFAULT NULL,
  'last_login' datetime DEFAULT NULL,
  'customer_id' int(11) DEFAULT NULL,
  'hours_watched' int(11) NOT NULL DEFAULT '0',
  'points' int(11) NOT NULL DEFAULT '0',
  'created_at' timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP,
  'updated_at' timestamp NULL DEFAULT NULL,
  'deleted_at' timestamp NULL DEFAULT NULL,
  'remember_token' varchar(100) COLLATE utf8_unicode_ci DEFAULT NULL,
  PRIMARY KEY ('id')
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci;
/*!40101 SET character_set_client = @saved_cs_client */;


....


--
-- Table structure for table 'videos'
--

DROP TABLE IF EXISTS 'videos';
/*!40101 SET @saved_cs_client     = @@character_set_client */;
/*!40101 SET character_set_client = utf8 */;
CREATE TABLE 'videos' (
  'id' varchar(36) COLLATE utf8_unicode_ci NOT NULL,
  'title' varchar(255) COLLATE utf8_unicode_ci NOT NULL,
  'is_public' smallint(6) NOT NULL DEFAULT '0',
  'is_visible' smallint(6) NOT NULL DEFAULT '0',
  'points' int(11) NOT NULL DEFAULT '0',
  'duration' varchar(10) COLLATE utf8_unicode_ci NOT NULL,
  'provider_id' varchar(36) COLLATE utf8_unicode_ci NOT NULL,
  'presenter_id' varchar(36) COLLATE utf8_unicode_ci NOT NULL,
  'level_id' varchar(36) COLLATE utf8_unicode_ci NOT NULL,
  'hd_url' varchar(255) COLLATE utf8_unicode_ci NOT NULL,
  'high_url' varchar(255) COLLATE utf8_unicode_ci NOT NULL,
  'mobile_url' varchar(255) COLLATE utf8_unicode_ci NOT NULL,
  'transcript_file' varchar(255) COLLATE utf8_unicode_ci DEFAULT NULL,
  'created_at' timestamp NOT NULL DEFAULT '0000-00-00 00:00:00',
  'updated_at' timestamp NOT NULL DEFAULT '0000-00-00 00:00:00',
  'deleted_at' timestamp NULL DEFAULT NULL,
  'order' int(11) NOT NULL DEFAULT '0',
  'prefix_title' varchar(20) COLLATE utf8_unicode_ci DEFAULT NULL,
  'jwplayer_mediaid' varchar(16) COLLATE utf8_unicode_ci DEFAULT NULL,
  PRIMARY KEY ('id'),
  KEY 'videos_level_id_foreign' ('level_id'),
  KEY 'videos_provider_id_foreign' ('provider_id'),
  KEY 'videos_presenter_id_foreign' ('presenter_id'),
  CONSTRAINT 'videos_level_id_foreign' FOREIGN KEY ('level_id') REFERENCES 'levels' ('id') ON DELETE CASCADE ON UPDATE CASCADE,
  CONSTRAINT 'videos_presenter_id_foreign' FOREIGN KEY ('presenter_id') REFERENCES 'presenters' ('id') ON UPDATE CASCADE,
  CONSTRAINT 'videos_provider_id_foreign' FOREIGN KEY ('provider_id') REFERENCES 'providers' ('id') ON UPDATE CASCADE
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci;
/*!40101 SET character_set_client = @saved_cs_client */;


...

/*!40014 SET FOREIGN_KEY_CHECKS=@OLD_FOREIGN_KEY_CHECKS */;
/*!40014 SET UNIQUE_CHECKS=@OLD_UNIQUE_CHECKS */;
  • 0
    Очень любопытный. Это дамп, так что, очевидно, он работал, и в определении нет ничего плохого. Работает в 5.7.21 и в любой версии 5.6, где sqlfiddle находится на sqlfiddle.com/#!9/985dce/1 .
Теги:
foreign-keys

1 ответ

0

Вы должны определить таблицу, которую хотите привязать (users), прежде чем вы сможете объявить ей внешний ключ.

В вашем случае вы создаете bookmarks в таблице перед тем, как будут существовать другие users таблицы.

Ошибка, которую вы получили, не имеет никакого отношения к отключению foreign_key_checks против включенного.


На самом деле, я должен исправить свой ответ. Этот файл дампа должен работать нормально и отлично работает, когда я тестирую его в своем локальном экземпляре MySQL 5.6.

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

SET @OLD_FOREIGN_KEY_CHECKS=@@FOREIGN_KEY_CHECKS, FOREIGN_KEY_CHECKS=0;

Это отключает принудительное использование правил внешнего ключа до тех пор, пока принудительное восстановление не будет восстановлено в конце:

SET FOREIGN_KEY_CHECKS=@OLD_FOREIGN_KEY_CHECKS;

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

  • 0
    хорошо - это то, о чем я думал, но не был уверен, есть ли способ заказать схему mysqldump, чтобы импорт не имел этой проблемы?
  • 0
    У меня есть grep'd для внешнего ключа в дампе - его размер ~ 1.2G - но я не смог найти никаких других ссылок, которые бы восстанавливали принудительное применение. Я должен продолжать искать. Я мог бы, вероятно, сделать два дампа, один для воссоздания схемы и один для добавления данных и посмотреть, смогу ли я изолировать проблему таким образом?

Ещё вопросы

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