Проблема удаления строк - PullRequest
4 голосов
/ 16 июня 2011

Когда я делаю что-то вроде:

DELETE FROM users_has_pais WHERE users_id = 151

Я получаю следующее сообщение об ошибке:

SQLSTATE [23000]: Нарушение ограничения целостности: 1451 Невозможно удалить или обновить родительскую строку: сбой ограничения внешнего ключа (gisele. users_has_pais, CONSTRAINT users_has_pais_ibfk_3 FOREIGN KEY (users_id) ССЫЛКИ users (id) В УДАЛЕНИИ НЕТ ДЕЙСТВИЙ В ОБНОВЛЕНИИ НЕТ ДЕЙСТВИЙ)

Я не уверен, в чем проблема, хотя я предполагаю, что это как-то связано с ON УДАЛИТЬ НЕТ ДЕЙСТВИЙ.Я не знаю, что мне следует изменить на это, хотя ... для справки я вставил дамп структуры моих таблиц:

CREATE TABLE IF NOT EXISTS `users` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`email` varchar(50) DEFAULT NULL,
`password` varchar(250) DEFAULT NULL,
`url` varchar(50) DEFAULT NULL,
`responsable` varchar(50) DEFAULT NULL,
`role` varchar(25) DEFAULT NULL,
`fecha` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
PRIMARY KEY (`id`),
UNIQUE KEY `email` (`email`)
) ENGINE=InnoDB  DEFAULT CHARSET=latin1 AUTO_INCREMENT=162 ;

CREATE TABLE IF NOT EXISTS `pais` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`pais` varchar(20) NOT NULL,
PRIMARY KEY (`id`),
UNIQUE KEY `pais` (`pais`)
) ENGINE=InnoDB  DEFAULT CHARSET=latin1 AUTO_INCREMENT=6 ;

users_has_pais | CREATE TABLE `users_has_pais` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`users_id` int(11) NOT NULL,
`pais_id` int(11) NOT NULL,
PRIMARY KEY (`id`),
KEY `user` (`users_id`),
KEY `index3` (`pais_id`),
KEY `users_id` (`users_id`),
KEY `pais_id` (`pais_id`),
CONSTRAINT `users_has_pais_ibfk_3` FOREIGN KEY (`users_id`) REFERENCES `users` (`id`) ON DELETE NO ACTION ON UPDATE NO ACTION,
CONSTRAINT `users_has_pais_ibfk_2` FOREIGN KEY (`pais_id`) REFERENCES `pais` (`id`) ON DELETE NO ACTION ON UPDATE NO ACTION
) ENGINE=InnoDB AUTO_INCREMENT=46 DEFAULT CHARSET=latin1 |

РЕДАКТИРОВАТЬ: вставка информации об ограничениях

Ответы [ 2 ]

3 голосов
/ 16 июня 2011

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

  • Измените ограничение на каскадное удаление (или другое правило ограничения), если это имеет смысл в вашей логике
  • Предупредить пользователя о проблеме и посоветовать ему сначала удалить другой объект
  • Заставьте ваше приложение удалять зависимые строки, а затем строку, которую вы пытаетесь удалить (согласно комментарию @RacerX).

Обновление

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

0 голосов
/ 16 июня 2011

Мои знания SQL не совсем на высшем уровне, но похоже, что вы удаляете что-то, на что ссылаются как на внешний ключ.

...