Первый опыт внешних ключей, что я сделал не так? - PullRequest
2 голосов
/ 10 января 2012

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

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

Вот ошибка:

 #1452 - Cannot add or update a child row: a foreign key constraint fails     (`nzua9c8_tasks`.<result 2 when explaining filename '#sql-2929_701930'>, CONSTRAINT `#sql-2929_701930_ibfk_1` FOREIGN KEY (`id`) REFERENCES `jobs` (`id`) ON UPDATE NO ACTION)

Кроме того, интерфейс для PHPMyAdmin предложил, чтобы при удалении задачи идентификатор сообщения был «ограничен». У меня не былоопция для удаления. Я хочу, чтобы любые сообщения с идентификатором "job_id", который совпадает с идентификатором в таблице заданий, также были удалены.

Спасибо за любую помощь.

Ответы [ 3 ]

2 голосов
/ 10 января 2012

Вы хотите добавить on delete cascade к определению внешнего ключа (сразу после on update no action в вашем скрипте).

Таким образом, это будет что-то вроде:

 alter table messages add foreign key (id) references jobs (id) on delete cascade

Еще можноможно найти здесь .

0 голосов
/ 10 января 2012

Внешние ключи с соответствующими «ограничениями» предназначены для обеспечения «ссылочной целостности» и решат упомянутую выше проблему «свисающей ссылки».

Недостатком внешних ключей является то, что данные должны быть заполнены вбаза данных в правильном порядке:

Если строки в таблице «A» содержат указатель внешнего ключа на одну или несколько строк в таблице «B», то строки в таблице «B» должны быть созданы перед строкамив таблице «А» может быть создан - в противном случае ограничение будет выдавать ошибку.

0 голосов
/ 10 января 2012

Если одно задание содержит несколько сообщений (отношение 1: N), таблица сообщений должна иметь внешний ключ к таблице заданий.

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

Так что если в табличных заданиях есть записи:

id name
1 job1
2 job2

А в таблице сообщений есть записи

id name job_id
1 mes1 1
2 mes2 2

Тогда вы не можете просто удалить запись из первой таблицы. Сначала вы должны обновить ссылочную запись в таблице сообщений.

Кроме того, вы можете изменить политику внешнего ключа таким образом, чтобы зависимые записи автоматически уничтожались / обновлялись.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...