Это работа для Mysql Foreign Keys? - PullRequest
3 голосов
/ 06 января 2010

За последние несколько лет я прочитал множество статей об иностранных ключах в MySQL, хотя ничего недавнего. Я знаю, что они хороши для использования в чем-то вроде темы форума, в которой есть дочерняя запись. Если я удалю тему с 100 сообщениями, связанными с этой темой, внешние ключи заставят ее удалить эти 100 тем для меня, правильно ли я пока исправляю ?

Я работаю в социальной сети в php / mysql, есть таблица пользователей с идентификатором пользователя, а затем есть около 10 других таблиц, которые связаны с этой таблицей этим полем идентификатора пользователя, если я буду использовать внешние ключи на этом? Мне никогда не потребуется обновлять все таблицы, но, например, если пользователь удаляет там учетную запись, в прошлом я выполнял PHP как 10 запросов на удаление, по 1 на каждую таблицу для пользователя. Похоже ли это хорошая работа, чтобы использовать Foreign Keys?

Ответы [ 5 ]

3 голосов
/ 06 января 2010

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

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

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

1 голос
/ 06 января 2010

Больше всего на свете Внешний ключ является ссылочным ограничением между двумя таблицами.

Его можно использовать для достижения того, что вы описываете, если у вас есть таблицы InnoDB с on delete cascade (см. 13.6.4.4. Ограничения FOREIGN KEY ) , но это определенно не первая причина, по которой вы должны использовать внешние ключи.

1 голос
/ 06 января 2010

Если вы используете внешние ключи, вы можете указать MySQL выполнить ссылочное действие при удалении ссылочной записи. Например, указание «CASCADE» в поле внешнего ключа скажет MySQL удалить любые записи, которые ссылаются на первичный ключ в указанной таблице. Ссылочное действие "SET NULL" установит для поля внешнего ключа значение NULL, когда будет удалена запись, на которую он ссылается в другой таблице.

0 голосов
/ 06 января 2010

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

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

http://dev.mysql.com/doc/refman/5.1/en/innodb-foreign-key-constraints.html

Кстати, MyISAM не поддерживает FK, он будет игнорировать их. Вы должны использовать InnoDB для этого.

0 голосов
/ 06 января 2010

если я удалю тему с 100 постами связаны с этой темой, внешние ключи заставит это удалить те 100 тем для меня, я прав до сих пор?

Это зависит от того, установлено ли у вас каскадное удаление. Каскадные удаления могут быть хорошими, но вы должны хорошо понимать последствия, потому что одно удаление может привести к «важным» вещам. Но да, если ваша цель состоит в том, чтобы удалить иерархию записей за одно удаление, внешние ключи с каскадным удалением являются жизнеспособным вариантом.

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