Могу ли я использовать ограничения внешнего ключа для возврата значимых ошибок пользовательского интерфейса с помощью PHP
Я хочу начать с того, что я большой поклонник использования внешних ключей и имею тенденцию использовать их даже в небольших проектах, чтобы моя база данных не была заполнена потерянными данными. В более крупных проектах я заканчиваю с кучей ключей, которые в конечном итоге покрывают более 8-10 слоев данных.
Я хочу знать, может ли кто-нибудь предложить изящный способ обработки "ожидаемых ошибок" из базы данных MySQL таким образом, чтобы я мог построить значимые сообщения для конечного пользователя. Я все объясню. "ожидаемые ошибки" с примером.Допустим, у меня есть набор таблиц, используемых для основных обсуждений:
discussion
questions
responses
users
Иерархически они, вероятно, выглядели бы примерно так:
-users
--discussion
---questions
----responses
Когда я пытаюсь удалить пользователя, FKs проверяет обсуждения, и если какие-либо обсуждения существуют, удаление ограничено, удаление обсуждения проверяет вопросы, удаление вопросов проверяет ответы. "Ожидаемой ошибкой" в этом случае будет попытка удалить пользователя-если только он не был создан заново. Я могу предвидеть, что один или несколько внешних ключей выйдут из строя, вызвав ошибку.
Что я хочу сделать, так это поймать эту ошибку при удалении и иметь возможность сказать конечному пользователю что-то вроде: "Мы сожалеем, но все обсуждения должны быть удалены, прежде чем вы сможете удалить этого пользователя...".
Теперь я знаю, что могу сохранять и поддерживать соответствующие массивы в PHP и сопоставлять определенные ошибки с сообщениями, но это беспорядочно и склонно к застою, или я мог бы вручную запустить набор выборок перед попыткой удаление, но тогда я делаю столько же работы, как и без использования FKs.
Любая помощь здесь была бы очень признательна, или если я просто смотрю на это совершенно неправильно, то, пожалуйста, дайте мне знать.В качестве примечания я обычно использую CodeIgniter для разработки моих приложений, поэтому, если это откроет путь через эту структуру, пожалуйста, учитывайте это в своих ответах.
Заранее спасибо
3 ответа:
К сожалению, MySQL не предоставляет возможности определить пользовательскую ошибку, как это было бы с SQL Server или Oracle.
- Запрос На Ошибку / Функцию #16999
- Worklog #2110 spec-это поведение для v5. 5
Решение
Проверьте этот пост в блоге об использовании UDF, чтобы иметь возможность определять пользовательские ошибки.
Похоже, что вам нужно определить свои внешние ключи с помощью
ON DELETE CASCADE
. Это приведет к удалению всех ссылочных данных в других таблицах.
Не следует полагаться на базу данных для создания ошибок в коде приложения. FK-Ы существуют, когда ваш код приложения портится и пытается удалить что-то, что он не должен.
Если вы действительно хотите дать пользователю хорошее сообщение об ошибке, вам придется сначала запустить selects и построить соответствующее сообщение об ошибке.
edit
Вы можете проверить наличие внешних ключей в одном выборе. Если вы используете доктрину, подобную ORM, вам даже не нужно указывать присоединяйтесь, просто скажите ему, какие поля выбрать, а затем проверьте каждую таблицу на наличие ненулевых строк.