Это чистое решение для 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;
}
Кредит относится к Dave и Sime Vidas
Использование более современных JS, hasClass
может быть реализовано как:
function hasClass(elem, className) {
return elem.classList.contains(className);
}
У меня была та же проблема и найдено решение, поместив 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 выполнил этот запрос!
Используйте 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
-операторы, а также намного легче построить и повторить.
Это также происходит при установке внешнего ключа parent.id на child.column, если у child.column уже есть значение 0, а значение parent.id равно 0
. Вам нужно будет убедиться что каждый child.column имеет значение NULL или имеет значение, существующее в parent.id
И теперь, когда я прочитал инструкцию nos, это то, что он проверяет.
Скорее всего, ваша таблица 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;
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
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
Убедитесь, что значение находится в другой таблице, иначе вы получите эту ошибку в назначенном соответствующем столбце.
Поэтому, если назначенный столбец назначен идентификатору строки другой таблицы, убедитесь, что есть строка, которая находится в таблице, иначе эта ошибка появится.
У меня есть решение, вам просто нужно ответить на один вопрос:
Ваша таблица уже хранит данные? Особенно это касается внешнего ключа.
Если да, то единственное, что вы делаете, это удалить всю запись, а затем вы можете добавить любой внешний ключ в своей таблице.
Команда удаления: от дочернего элемента (который включает таблицу внешнего ключа) в родительскую таблицу.
blockquote>Причина, по которой вы не можете добавить внешний ключ после ввода данных из-за несогласованности таблицы , что вы собираетесь обрабатывать новым внешним ключом на ранее заполненной таблицей данных?
Если нет, следуйте другим инструкциям.
У меня была такая же проблема сегодня. Я тестировал четыре вещи, некоторые из них уже упомянуты здесь:
У меня была одна таблица в utf-8, а другая в iso-something. Это не сработало. После изменения команды iso-table в utf-8 ограничения могут быть добавлены без проблем. В моем случае phpMyAdmin даже не показывал дочернюю таблицу в изокодировании в раскрывающемся списке для создания ограничения внешнего ключа.
Кажется, есть некорректное значение для столбца типа 0, который не является допустимым внешним ключом, поэтому MySQL не может установить для него ограничение внешнего ключа.
Вы можете выполнить следующие шаги:
У меня была та же проблема, я проверил строки моих таблиц и обнаружил, что существует некоторая несовместимость со значением полей, которые я хотел бы определить как внешний ключ. Я исправил эти значения, попытался снова, и проблема была решена.
UPDATE sourcecodes_tags
SET sourcecode_id = NULL
WHERE sourcecode_id NOT IN (
SELECT id FROM sourcecodes);
должен помочь избавиться от этих идентификаторов. Или, если null
не разрешено в sourcecode_id
, удалите эти строки или добавьте эти отсутствующие значения в таблицу sourcecodes
.
У меня была такая же проблема с моей базой данных mysql, но в конце концов я получил решение, которое сработало для меня. Поскольку в моей таблице все было в порядке с точки зрения mysql (обе таблицы должны использовать движок Innodb, а тип данных каждого столбца должен быть того же типа, который принимает участие в ограничении внешнего ключа). Единственное, что я сделал, это отключить проверку внешнего ключа, а затем включить его после выполнения операции с внешним ключом. Шаги, которые я взял:
blockquote>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;
попробуйте это
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;
Я знаю, что это решение немного неудобно, но оно работает на 100%. Но я согласен, что это не идеальное решение для решения проблемы, но я надеюсь, что это поможет.
Я готовил эти решения, и этот пример может помочь.
В моей базе данных есть две таблицы (электронная почта и кредитная карточка) с первичными ключами для их идентификаторов. Другая таблица (клиент) ссылается на эти идентификаторы таблиц как внешние ключи. У меня есть причина, чтобы электронная почта была отделена от данных клиента.
Сначала я вставляю данные строки для ссылочных таблиц (email, credit_card), после чего вы получаете идентификатор для каждого, эти идентификаторы необходимы в третья таблица (клиент).
Если вы не вставляете сначала строки в ссылочные таблицы, MySQL не сможет выполнить соответствующие соответствия, когда вы вставляете новую строку в третью таблицу, ссылающуюся на внешние ключи.
Если вы сначала вставляете ссылочные строки для ссылочных таблиц, тогда строка, которая ссылается на внешние ключи, не возникает ошибка.
Надеюсь, это поможет.
Я получал эту ошибку при использовании Laravel и eloquent, пытаясь сделать ссылку на внешний ключ, вызывая 1452. Проблема заключалась в отсутствии данных в связанной таблице.
Пожалуйста, смотрите здесь пример : http://mstd.eu/index.php/2016/12/02/laravel-eloquent-integrity-constraint-violation-1452-foreign-key-constraint/
В итоге я удалю все данные в своей таблице и снова заново сработаю. Оно работает. Не блестящий, но это экономит много времени, особенно ваше приложение все еще находится на стадии разработки без каких-либо данных о клиенте.
Для меня эта проблема была немного иной и очень легко проверить и решить.
Вы должны убедиться, что ваши таблицы - это InnoDB. Если одна из таблиц, а именно эталонная таблица - это MyISAM, ограничение не будет выполнено.
SHOW TABLE STATUS WHERE Name = 't1';
ALTER TABLE t1 ENGINE=InnoDB;