MySQL удалить и удалить из таблицы многие ко многим в одной транзакции

Можно ли удалить из таблицы сопоставления (многие-ко-многим) и вставить в нее ту же строку в той же транзакции?

Это моя таблица ассоциаций:

CREATE TABLE image_tag (
imageid bigint(19) NOT NULL,
tagid   bigint(19) NOT NULL,
PRIMARY KEY (imageid, tagid));
ALTER TABLE image_tag ADD INDEX FKimage_tag587679 (tagid), ADD CONSTRAINT  FKimage_tag587679 FOREIGN KEY (tagid) REFERENCES tag (id);
ALTER TABLE image_tag ADD INDEX FKimage_tag426448 (imageid), ADD CONSTRAINT FKimage_tag426448 FOREIGN KEY (imageid) REFERENCES image (id);

Когда я создаю новое изображение и вставляю в изображение, вставляю в тег и вставляю в image_tag за одну транзакцию, все работает.

Проблема возникает, когда я хочу обновить изображение и я:

  • начать транзакцию
  • обновить изображение с указанным $ id
  • вызов: DELETE FROM image_tag WHERE imageid = $ id
  • проверьте, является ли image_tag пустым для imageid = $ id (и оно есть)
  • получить идентификаторы новых тегов (некоторые из них остаются неизменными)
  • попробуй вставить в image_tag … но получаю исключение

Исключение:

Cannot add or update a child row: a foreign key constraint fails (`mydatabase`.`image_tag`, CONSTRAINT `FKimage_tag426448` FOREIGN KEY  (`imageid`) REFERENCES `image` (`id`))

Данные:

Original data: (194, 123), (194, 225), (194, 291)
New data: (194, 123), (194, 225), (194, 65)

Исходный код (на PHP):

if ($editation) {
if ($values->image->isOk()) {
$url = $img->load($values->id)->getUrl();
$values->image->move($this->wwwDir . "/" . $url);
} else {
$url = null;
}
$img->update($values->name, $values->descr, $url, null, $featured);
} else {
$uname = $img->createUniqueName($values->name);
$url = ImageManager::PATH . "/" . $uname . ".svg";
$values->image->move($this->wwwDir . "/" . $url);
$img->create($userId, $values->name, $url, $values->descr, null, $featured);
}

// Delete old image-tag associations if any
$this->db->query('DELETE FROM image_tag WHERE imageid = %i', $img->getId());

// Save tags and assign them to image
$tagIds = $this->tagManager->saveTags($values->tags);
$assoc = (new Dao\ImageTag())->setDb($this->db);
//throw new \Exception(implode(",", $tagIds));
foreach ($tagIds as $tagId) {
// EXCEPTION IS THROWED HERE (but only after editation)
$assoc->create($img->getId(), $tagId);
}

0

Решение

Вы не пытаетесь обновить тег image_tag с неверным идентификатором? ..null, 0, -1 или что-то еще?

Посмотрите на свой код. Я полагаю, что $ img и $ values-> image не совпадают, но вы загружаете $ img, только если указана $ values-> image. Тем не менее, вы пытаетесь обновить image_tag каждый раз.

1

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]