2014-01-25 3 views
-1

Я пытаюсь переместить содержимое из WordPress сообщений в мезонин с помощью:MySQL ERROR 1452 (23000): Невозможно добавить или обновить дочернюю строку: ограничение внешнего ключа не удается

INSERT INTO mezdb.blog_blogpost (id, user_id, publish_date, 
      content, title, description, slug, updated, status) 
SELECT DISTINCT ID, post_author, post_date, post_content, post_title, post_excerpt, 
    post_name, post_modified, post_status 
FROM wpdb.wp_posts WHERE wp_posts.post_type IN ('story'); 

, но я получаю

ERROR 1452 (23000): Невозможно добавить или обновить дочернюю строку:. внешний ключ ограничение не удается (mezdbblog_blogpost, скованность site_id_refs_id_ac21095f FOREIGN KEY (site_id) Лит django_site (id))

mezdb схема:

CREATE TABLE `blog_blogpost` (
    `id` integer AUTO_INCREMENT NOT NULL PRIMARY KEY, 
    `comments_count` integer NOT NULL, 
    `keywords_string` varchar(500) NOT NULL, 
    `rating_count` integer NOT NULL, 
    `rating_sum` integer NOT NULL, 
    `rating_average` double precision NOT NULL, 
    `site_id` integer NOT NULL, 
    `title` varchar(500) NOT NULL, 
    `slug` varchar(2000), 
    `_meta_title` varchar(500), 
    `description` longtext NOT NULL, 
    `gen_description` bool NOT NULL, 
    `created` datetime, 
    `updated` datetime, 
    `status` integer NOT NULL, 
    `publish_date` datetime, 
    `expiry_date` datetime, 
    `short_url` varchar(200), 
    `in_sitemap` bool NOT NULL, 
    `content` longtext NOT NULL, 
    `user_id` integer NOT NULL, 
    `allow_comments` bool NOT NULL, 
    `featured_image` varchar(255) 
); 

Я нуб в SQL так ценю ваши советы.

+0

Я предполагаю, что некоторые строки уже вставлены, тогда вам нужно обновить его, а не вставить –

ответ

4

Попробуйте это:

set foreign_key_checks=0; 
INSERT INTO mezdb.blog_blogpost (id, user_id, publish_date, 
     content, title, description, slug, updated, status) 
SELECT DISTINCT ID, post_author, post_date, post_content, post_title, post_excerpt, 
post_name, post_modified, post_status 
FROM wpdb.wp_posts WHERE wp_posts.post_type IN ('story'); 
set foreign_key_checks=1; 

Примечание: это простое решение, но определенно не хороший идея. Или вы должны быть очень хорошо осведомлены о том, что вы делаете.

Суть foreign keys заключается в поддержании the referential integrity, другими словами, данные согласованности. Проще говоря, база данных не позволяет вставлять неправильное значение в столбец с внешним ключом. Теперь должно быть ясно, что отключить проверку внешнего ключа , чтобы иметь возможность вставить неправильное значение, запахи очень опасны.

См. Ответ StuartLC для правильного решения.

+0

работал как шарм. Ура! – qliq

+0

Но подождите. Какой смысл иметь внешний ключ, если вы отключите его проверку? Если кто-то будет использовать ваш запрос, он просто создал несоответствие в своей базе данных. Главным моментом внешних ключей является сохранение [ссылочной целостности] (https://en.wikipedia.org/wiki/Referential_integrity), другими словами, согласованность данных. Просто не нужно создавать внешний ключ в таблице, чтобы предотвратить вставку неправильных значений, а затем отключить его, чтобы вставить неправильное значение. –

2

django_site таблица должна содержать по крайней мере одну запись, и каждая запись в blog_blogpost должны иметь ссылку на него - blog_blogpost.site_id поле является ссылкой на django_site.id, как говорит сообщение об ошибке.

Таким образом, вы просто должны поместить константу в вашем запросе:

INSERT INTO mezdb.blog_blogpost(
    id, 
    user_id, 
    publish_date, 
    content, 
    title, 
    description, 
    slug, 
    updated, 
    status, 
    site_id) -- This is a reference field 
SELECT 
    DISTINCT id, 
    post_author, 
    post_date, 
    post_content, 
    post_title, 
    post_excerpt, 
    post_name, 
    post_modified, 
    post_status, 
    1 -- This is your constant, it may be different - look it up in 'django_site' 
FROM wpdb.wp_posts WHERE wp_posts.post_type IN ('story'); 
+0

Ну, это дает: ОШИБКА 1452 (23000): Невозможно добавить или обновить дочернюю строку: ограничение внешнего ключа не выполняется ('mezdb '.'blog_blogpost', CONSTRAINT' user_id_refs_id_01a962b8' FOREIGN KEY ('user_id') ССЫЛКИ' auth_user' ('id')). Я пробовал другие цифры, чем эффект 1.not – qliq

+1

@qliq Это другая ошибка, но проблема такая же. Ваша таблица 'auth_user' может быть пуста, поэтому другое ограничение не выполняется. Сначала вы должны перенести пользователей, сохранив их идентификаторы, и тогда это должно быть хорошо, если только другие ограничения не будут выполнены. Идея такова: ** перенести таблицы, которые сначала не имеют ограничений, а затем перенести таблицы, которые ссылаются на эти таблицы, при переносе таблиц, которые ссылаются на таблицы «второго порядка» и т. Д. ** - представьте, что вы воссоздаете дерево, начиная с «листа». – scriptin

4

site_id определяется как integer NOT NULL и в соответствии с сообщением об ошибке имеет внешний ключ django_site (id).

Вы не указали site_id в своем списке вставки. Вам нужно будет указать значение для site_id и дать ему значение, которое существует в таблице django_site, столбец id.

В качестве альтернативы, если вы не в состоянии определить действительное site_id значение, измените blog_blogpost столбец таблицы site_id разрешить NULL (т.е. site_id integer NULL). Очевидно, что INNER JOINS between blog_blogpost and django_site` теперь нужно будет пересмотреть.

0

ERROR 1452 (23000): Невозможно добавить или обновить дочернюю строку: внешний ключ ограничение терпит неудачу (mezdb.blog_blogpost, скованность site_id_refs_id_ac21095f FOREIGN KEY (SITE_ID) ЛИТЕРАТУРА django_site (ID))

Таблица blog_blogpost Схема:

The site_id число NOT NULL

что означает site_id не NULL и из сообщения об ошибке мы можем прийти к выводу, что он ссылается на django_site(id)) другой таблицы.

Основная причина этой проблемы:

  1. в вашем запросе вставки вы не прошли siteid
  2. иметь в виду, что значение site_id ваш переход должен быть там в django_site(id)) колонке, как это упоминается в качестве внешнего ключа

Решение:

  1. Процент Site_id Значение, которое присутствует в django_site(id)) Столбец таблицы, на который делается ссылка.