Невозможно добавить или обновить дочернюю строку: ограничение внешнего ключа завершается неудачей: tablas mal indexadas? [Дубликат]

Это чистое решение для JavaScript без каких-либо библиотек или плагинов:

document.addEventListener('click', function (e) {
    if (hasClass(e.target, 'bu')) {
        // .bu clicked
        // Do your thing
    } else if (hasClass(e.target, 'test')) {
        // .test clicked
        // Do your other thing
    }
}, false);

, где hasClass -

function hasClass(elem, className) {
    return elem.className.split(' ').indexOf(className) > -1;
}

Live demo

Кредит относится к Dave и Sime Vidas

Использование более современных JS, hasClass может быть реализовано как:

function hasClass(elem, className) {
    return elem.classList.contains(className);
}

225
задан SOFe 27 February 2017 в 09:18
поделиться

19 ответов

У меня была та же проблема и найдено решение, поместив NULL вместо NOT NULL в столбец внешнего ключа. Вот запрос:

ALTER TABLE `db`.`table1`
ADD COLUMN `col_table2_fk` INT UNSIGNED NULL,
ADD INDEX `col_table2_fk_idx` (`col_table2_fk` ASC),
ADD CONSTRAINT `col_table2_fk1`
FOREIGN KEY (`col_table2_fk`)
REFERENCES `db`.`table2` (`table2_id`)
ON DELETE NO ACTION
ON UPDATE NO ACTION;

MySQL выполнил этот запрос!

0
ответ дан akelec 19 August 2018 в 05:17
поделиться

Используйте NOT IN, чтобы найти, где ограничения ограничены :

SELECT column FROM table WHERE column NOT IN 
(SELECT intended_foreign_key FROM another_table)

, а точнее:

SELECT sourcecode_id FROM sourcecodes_tags WHERE sourcecode_id NOT IN 
(SELECT id FROM sourcecodes)

EDIT: IN и NOT IN, как известно, намного быстрее, чем JOIN -операторы, а также намного легче построить и повторить.

53
ответ дан Cayetano Gonçalves 19 August 2018 в 05:17
поделиться
  • 1
    Итак, если я правильно понимаю это, мы можем добавить внешний ключ к таблице, в которой уже есть данные, но только если для каждой строки в родительской таблице существует дочерняя строка? Если для каждой строки родительской таблицы нет дочерних строк (это то, что ваш запрос обнаруживает), тогда скрипт внешнего ключа завершится с ошибкой. – Vincent 16 January 2015 в 20:05
  • 2
    @Vincent, если по родительской таблице вы имеете в виду таблицу, на которую ссылаются, тогда да! Поэтому с выбором Cayetano вы получаете все строки, которые вам нужно обновить / удалить из вашего «ребенка». перед добавлением нового ограничения (FK). Как только все они указывают на значения в "another_table" то ты хочешь пойти! – Armfoot 19 November 2015 в 23:21

Это также происходит при установке внешнего ключа parent.id на child.column, если у child.column уже есть значение 0, а значение parent.id равно 0

. Вам нужно будет убедиться что каждый child.column имеет значение NULL или имеет значение, существующее в parent.id

И теперь, когда я прочитал инструкцию nos, это то, что он проверяет.

14
ответ дан fyrye 19 August 2018 в 05:17
поделиться

Скорее всего, ваша таблица sourcecodes_tags содержит значения sourcecode_id, которые больше не существуют в вашей таблице sourcecodes. Вы должны сначала избавиться от них.

Вот запрос, который может найти эти идентификаторы:

SELECT DISTINCT sourcecode_id FROM 
   sourcecodes_tags tags LEFT JOIN sourcecodes sc ON tags.sourcecode_id=sc.id 
WHERE sc.id IS NULL;
213
ответ дан Jannis 19 August 2018 в 05:17
поделиться
  • 1
    UPDATE sourcecodes_tags SET sourcecode_id = NULL WHERE sourcecode_id NOT IN (SELECT id FROM sourcecodes) должен помочь избавиться от этих идентификаторов. Или если null не разрешено в sourcecode_id, удалите эти строки или добавьте эти отсутствующие значения в таблицу sourcecodes. – naXa 23 February 2016 в 15:28
  • 2
    Я думал то же самое, но для меня SELECT Tchild.id FROM Tchild INNER JOIN Tmain ON Tmain.id = Tchild.fk_id WHERE Tmain.id IS NULL ничего не возвращает, поэтому проблема в другом месте!? – Meloman 26 July 2017 в 13:35

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

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

1
ответ дан Kingsley Mitchell 19 August 2018 в 05:17
поделиться

У меня есть решение, вам просто нужно ответить на один вопрос:

Ваша таблица уже хранит данные? Особенно это касается внешнего ключа.

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

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

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

Если нет, следуйте другим инструкциям.

2
ответ дан MarthyM 19 August 2018 в 05:17
поделиться
  • 1
    VHanded дал тот же ответ 3 года назад. Будем надеяться, что в таблицах не было никаких важных данных ... – xlecoustillier 23 April 2015 в 09:02

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

  1. Существуют ли какие-либо значения в вашем дочернем столбце, которые не существуют в родительском столбце (помимо NULL, если дочерний столбец имеет значение NULL )
  2. У родительского и родительского столбцов одинаковый тип данных?
  3. Есть ли указатель в родительском столбце, на который вы ссылаетесь? MySQL, похоже, требует этого по соображениям производительности ( http://dev.mysql.com/doc/refman/5.5/en/create-table-foreign-keys.html )
  4. И этот решил для меня: У обеих таблиц одинаковая сортировка?

У меня была одна таблица в utf-8, а другая в iso-something. Это не сработало. После изменения команды iso-table в utf-8 ограничения могут быть добавлены без проблем. В моем случае phpMyAdmin даже не показывал дочернюю таблицу в изокодировании в раскрывающемся списке для создания ограничения внешнего ключа.

13
ответ дан Michael Helwig 19 August 2018 в 05:17
поделиться

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

Вы можете выполнить следующие шаги:

  1. Отбросьте столбец, который вы пытались установить для ограничения FK.
  2. Добавьте его снова и установите его значение по умолчанию как NULL.
  3. Попробуйте установить ограничение внешнего ключа для это снова.
7
ответ дан Milad 19 August 2018 в 05:17
поделиться

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

5
ответ дан Mostafa -T 19 August 2018 в 05:17
поделиться
UPDATE sourcecodes_tags
SET sourcecode_id = NULL
WHERE sourcecode_id NOT IN (
  SELECT id FROM sourcecodes);

должен помочь избавиться от этих идентификаторов. Или, если null не разрешено в sourcecode_id, удалите эти строки или добавьте эти отсутствующие значения в таблицу sourcecodes.

0
ответ дан naXa 19 August 2018 в 05:17
поделиться

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

mysql> SET foreign_key_checks = 0;

mysql> alter table tblUsedDestination add constraint f_operatorId foreign key(iOperatorId) references tblOperators (iOperatorId); Query
OK, 8 rows affected (0.23 sec) Records: 8  Duplicates: 0  Warnings: 0

mysql> SET foreign_key_checks = 1;
90
ответ дан oers 19 August 2018 в 05:17
поделиться
  • 1
    foreign_key_checks есть по какой-то причине. Если вы не можете добавить внешний ключ, поскольку он нарушает ограничение, вы должны сначала исправить данные. Выключение проверки, а затем добавление ключа оставляет вас в противоречивом состоянии. Внешние проверки ключей добавляют накладные расходы, если вы не хотите их использовать, а затем используйте myisam. – cs_alumnus 20 March 2014 в 00:44
  • 2
    @AbuSadatMohammedYasin нет, это не должно: вопрос задан «что происходит» & quot; и этот ответ просто не пытается объяснить это. Как упоминал cs_alumnus, существует большая проблема: все новые значения, которые должны ссылаться на другое значение в другой таблице (как должен выглядеть ключ Foreign ), могут указывать на ничего, создавая несогласованное состояние. Краткое и эффективное объяснение Cayetano позволяет вам найти значения, которые вы должны обновить перед созданием ограничения, чтобы вы не удивлялись запросам, которые должны возвращать значения, которые должны существовать! – Armfoot 19 November 2015 в 23:13

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

SET foreign_key_checks = 0;

ALTER TABLE sourcecodes_tags ADD FOREIGN KEY (sourcecode_id) REFERENCES sourcecodes (id) ON DELETE CASCADE ON UPDATE CASCADE

SET foreign_key_checks = 1;
3
ответ дан rink.attendant.6 19 August 2018 в 05:17
поделиться

Усекайте таблицы, а затем попробуйте добавить ограничение FK.

Я знаю, что это решение немного неудобно, но оно работает на 100%. Но я согласен, что это не идеальное решение для решения проблемы, но я надеюсь, что это поможет.

23
ответ дан Shankar Damodaran 19 August 2018 в 05:17
поделиться
  • 1
    Не нужно урезать все. "UPDATE sourcecodes_tags SET sourcecode_id = NULL WHERE sourcecode_id NOT IN (SELECT id FROM sourcecodes) & quot; должно быть достаточно. Или, если в «sourcecode_id» значение null не разрешено, затем удалите эти строки или добавьте эти недостающие значения в «исходные коды», Таблица. – Torben 19 August 2013 в 11:45
  • 2
    Иногда, если данные увеличивают автоинкремент PK, это заставляет вас усекать. – François Breton 2 October 2013 в 16:33
  • 3
    @ShankarDamodaran не знает, почему усечение стола работает, но это решение сработало для меня. Я смог заставить свои отношения работать ... СПАСИБО! – MizAkita 11 April 2014 в 04:59
  • 4
    @MizAkita работает, потому что она удаляет строки, которые не имеют соответствующего значения в другой таблице, что позволяет создать новое ограничение. Если вы просто найдете эти строки и обновите или удалите их (например, предложение Cayetano ), вам не нужно удалять другие строки ... – Armfoot 20 November 2015 в 11:34
  • 5
    @Armfoot - эта проблема возникла при добавлении первой строки в таблицу с внешним ключом. Таким образом, у меня не было строк для поиска. – Krewetka 6 May 2016 в 08:41

Я готовил эти решения, и этот пример может помочь.

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

Сначала я вставляю данные строки для ссылочных таблиц (email, credit_card), после чего вы получаете идентификатор для каждого, эти идентификаторы необходимы в третья таблица (клиент).

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

Если вы сначала вставляете ссылочные строки для ссылочных таблиц, тогда строка, которая ссылается на внешние ключи, не возникает ошибка.

Надеюсь, это поможет.

1
ответ дан SyntheticMeshwork 19 August 2018 в 05:17
поделиться
  • 1
    MySQL & GT; вставлять значения электронной почты (адрес электронной почты) ('xxx@yyy.com'); MySQL & GT; вставить в значения ndtc (ndtc, year, month) ('1111222233334444', '2000', '01'); MySQL & GT; вставлять значения cliente (nombres, apellidos, telefono, idNDTC, idEmail) ('myname', 'myapp', '5555555555', 1,1); – SyntheticMeshwork 16 March 2016 в 02:44

Я получал эту ошибку при использовании Laravel и eloquent, пытаясь сделать ссылку на внешний ключ, вызывая 1452. Проблема заключалась в отсутствии данных в связанной таблице.

Пожалуйста, смотрите здесь пример : http://mstd.eu/index.php/2016/12/02/laravel-eloquent-integrity-constraint-violation-1452-foreign-key-constraint/

2
ответ дан twigg 19 August 2018 в 05:17
поделиться

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

4
ответ дан VHanded 19 August 2018 в 05:17
поделиться

Для меня эта проблема была немного иной и очень легко проверить и решить.

Вы должны убедиться, что ваши таблицы - это InnoDB. Если одна из таблиц, а именно эталонная таблица - это MyISAM, ограничение не будет выполнено.

SHOW TABLE STATUS WHERE Name =  't1';

ALTER TABLE t1 ENGINE=InnoDB;
14
ответ дан zmonteca 19 August 2018 в 05:17
поделиться
2
ответ дан MarthyM 30 October 2018 в 17:13
поделиться
1
ответ дан Fouad Mekkey 30 October 2018 в 17:13
поделиться
Другие вопросы по тегам:

Похожие вопросы: