Могу ли я использовать ограничения внешнего ключа для возврата значимых ошибок пользовательского интерфейса с помощью PHP


Я хочу начать с того, что я большой поклонник использования внешних ключей и имею тенденцию использовать их даже в небольших проектах, чтобы моя база данных не была заполнена потерянными данными. В более крупных проектах я заканчиваю с кучей ключей, которые в конечном итоге покрывают более 8-10 слоев данных.

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

Допустим, у меня есть набор таблиц, используемых для основных обсуждений:

discussion
questions
responses
users

Иерархически они, вероятно, выглядели бы примерно так:

-users
--discussion
---questions
----responses

Когда я пытаюсь удалить пользователя, FKs проверяет обсуждения, и если какие-либо обсуждения существуют, удаление ограничено, удаление обсуждения проверяет вопросы, удаление вопросов проверяет ответы. "Ожидаемой ошибкой" в этом случае будет попытка удалить пользователя-если только он не был создан заново. Я могу предвидеть, что один или несколько внешних ключей выйдут из строя, вызвав ошибку.

Что я хочу сделать, так это поймать эту ошибку при удалении и иметь возможность сказать конечному пользователю что-то вроде: "Мы сожалеем, но все обсуждения должны быть удалены, прежде чем вы сможете удалить этого пользователя...".

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

Любая помощь здесь была бы очень признательна, или если я просто смотрю на это совершенно неправильно, то, пожалуйста, дайте мне знать.

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

Заранее спасибо

3 2

3 ответа:

К сожалению, MySQL не предоставляет возможности определить пользовательскую ошибку, как это было бы с SQL Server или Oracle.

Решение


Проверьте этот пост в блоге об использовании UDF, чтобы иметь возможность определять пользовательские ошибки.

Похоже, что вам нужно определить свои внешние ключи с помощью ON DELETE CASCADE. Это приведет к удалению всех ссылочных данных в других таблицах.

Не следует полагаться на базу данных для создания ошибок в коде приложения. FK-Ы существуют, когда ваш код приложения портится и пытается удалить что-то, что он не должен.

Если вы действительно хотите дать пользователю хорошее сообщение об ошибке, вам придется сначала запустить selects и построить соответствующее сообщение об ошибке.

edit

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