Это действительный запрос MySQL? - PullRequest
3 голосов
/ 21 апреля 2011

У меня есть 4 таблицы: пользователи, сообщения, файлы, заметки. Я хочу сделать запрос, который удалит все вещи пользователя, если он будет удален. Будет ли работать следующее:

DELETE FROM users, messages, files, notes WHERE userId = '$userId'

Все 4 таблицы имеют столбец userId

Ответы [ 5 ]

5 голосов
/ 21 апреля 2011

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

DELETE FROM users WHERE userId = '$userId'
DELETE FROM messages WHERE userId = '$userId'
DELETE FROM files WHERE userId = '$userId'
DELETE FROM notes WHERE userId = '$userId'

Другой альтернативой будет каскадное удаление удалений по внешним ключам.

При создании внешнего ключа вы можете выбрать, что вы хотите сделать с дочерними записями при удалении родительской записи. Это обозначено ниже, указав ON Delete при создании внешнего ключа. Вот некоторая ссылка http://dev.mysql.com/doc/refman/5.5/en/innodb-foreign-key-constraints.html

[CONSTRAINT [symbol]] FOREIGN KEY
    [index_name] (index_col_name, ...)
    REFERENCES tbl_name (index_col_name,...)
    [ON DELETE reference_option]
    [ON UPDATE reference_option]
2 голосов
/ 21 апреля 2011
DELETE  u, m, f, p
FROM    users u
LEFT JOIN
        messages m
ON      m.user_id = u.id
LEFT JOIN
        files f
ON      f.user_id = u.id
LEFT JOIN
        posts p
ON      p.user_id = u.id
WHERE   u.id = 1

Предполагается, что запись с id = 1 существует в users, в противном случае ничего не будет удалено.

Обратите внимание, однако, что это не очень эффективно, и четыре отдельных удаления будут работать лучше.

1 голос
/ 21 апреля 2011

В вашем WHERE у вас есть userId = '$ userId'. Другие люди могут исправить меня, если я ошибаюсь, но я уверен, что userId будет неоднозначным, и это утверждение не будет выполнено. @ Джон Хартсокс ответ должен работать, хотя, если это действительно так.

Это не только вопрос. Если вы беспокоитесь о том, чтобы убедиться, что пользователь полностью удален, вам следует использовать ограничения внешнего ключа. Вы сказали, что при удалении пользователя вы хотите убедиться, что вся информация, относящаяся к этому пользователю, удалена. Если вы добавляете ограничение FK к каждой таблице, имеющей идентификатор пользователя (кроме таблицы users, в этом случае у нее будет ограничение первичного ключа), у вас не будет возможности удалить пользователя без предварительной проверки всех остальных данные, ссылающиеся на этого пользователя, удалены.

1 голос
/ 21 апреля 2011

в операторе where, если у вас более одной ссылки на таблицу, вы должны ссылаться на TABLE.COLUMN, например: WHERE users.userid = '$userId'. Я рекомендую делать 1 предложение на таблицу

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