1 / 1 / 3
Регистрация: 26.11.2011
Сообщений: 169
MySQL

Удаление данных из связанных таблиц

18.11.2013, 16:33. Показов 3301. Ответов 12
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Приветствую!
БД - MySql.
Подскажите как реализовать проверку удаления данных из таблицы, например: Таблица клиенты и заказы. Когда удаляем клиента и при этом этот клиент используется в табл заказы, то он не удаляет запись (проводит анализ возможности удаления и выдает системную ошибку mysql о том что запись используется.).
Вопрос: как отобразить невозможность удаления на понятном для пользователя языке.
Спасибо.
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
18.11.2013, 16:33
Ответы с готовыми решениями:

Удаление связанных данных из таблиц
Имеется таблица А которая связана с последующими таблицами В,С...(их порядка 10). Хочу удалить все записи из таблиц В,С... которые...

Удаление связанных таблиц
У меня возникла трудность в удалении связанных таблиц. Моё приложение перед его закрытием удаляет пустые таблицы из БД. Эти таблицы...

Удаление записей из связанных таблиц
суть темы такова: у меня есть 2 таблицы: Клиенты и Заказы. Таблицы размещены на разных формах. В таблице Клиенты есть поля: id_kl, FIO. В...

12
4217 / 3059 / 583
Регистрация: 21.01.2011
Сообщений: 13,203
18.11.2013, 16:36
Принцип общий для всех СУБД: отлавливаешь появление ошибки/исключения, анализируешь код ошибки, выдаешь свое сообщение.
1
1 / 1 / 3
Регистрация: 26.11.2011
Сообщений: 169
18.11.2013, 16:41  [ТС]
Цитата Сообщение от Grossmeister Посмотреть сообщение
Принцип общий для всех СУБД: отлавливаешь появление ошибки/исключения, анализируешь код ошибки, выдаешь свое сообщение.
А нет примера хотя бы одной обработки ошибки?...
0
8 / 8 / 1
Регистрация: 11.11.2013
Сообщений: 43
18.11.2013, 16:53
alex9910, если у тебя стоит проверка на целостность данных и не установлено каскадное удаление, то удалить запись ты не сможешь. Соответственно воспользуйся try - except

Таблица ошибок MySQL

Мануал по конструкции
1
1 / 1 / 3
Регистрация: 26.11.2011
Сообщений: 169
18.11.2013, 18:13  [ТС]
Freestyler2013, спасибо. Пойду разбираться...

Добавлено через 1 час 13 минут
Freestyler2013, т.е. как я понял:
пишем

Delphi
1
2
3
4
5
6
 Try
//тут пишем удаление
Except
    ShowMessage('Невозможно удалить, возможно т.к. запись используется!');
//обновляем таблицу
  end;
0
8 / 8 / 1
Регистрация: 11.11.2013
Сообщений: 43
18.11.2013, 18:40
alex9910, да, конструкция такая.
Только уж сделай красиво, используй
Delphi
1
MessageBox(self.Handle, 'У данного клиента есть заказы.', 'Удаление невозможно', MB_OK + MB_ICONINFORMATION);
1
4217 / 3059 / 583
Регистрация: 21.01.2011
Сообщений: 13,203
19.11.2013, 09:55
Только в except надо проанализировать код ошибки, поскольку ошибки м.б. разные.
0
1 / 1 / 3
Регистрация: 26.11.2011
Сообщений: 169
19.11.2013, 13:31  [ТС]
Grossmeister, а как точно понять какую ошибку брать?
Выходит сначала

First chance exception at $7722C41F. Exception class EOleException with message 'Аргументы имеют неверный тип, выходят за пределы допустимого диапазона или вступают в конфликт друг с другом'.

Потом
First chance exception at $7722C41F. Exception class EOleException with message '[MySQL][ODBC 5.2(a) Driver][mysqld-5.6.14-log]Cannot delete or update a parent row: a foreign key constraint fails (`mmservice`.`repair`, CONSTRAINT `id_clients` FOREIGN KEY (`id_clients`) REFERENCES `clients` (`id_clients`) ON DELETE NO ACTION ON UPDATE NO ACTION)'.


Получается берем EOleException? Как указать именно ошибку самого mysql...
В MySQL это ошибка 1451.

Delphi
1
2
3
4
5
try
//Пытаемся произвести удаление
except
on EOleException  do showmessage('Не возможно удалить запись');
end;
Может быть так?
Delphi
1
2
3
4
5
6
7
8
9
try
//Пытаемся произвести удаление
except
    on E: EOleException do
    begin
      if E.ErrorCode = 1451 then
        ShowMessage('Не возможно удалить!');
    end;
end;
0
132 / 129 / 31
Регистрация: 12.12.2011
Сообщений: 463
19.11.2013, 14:52
Сначала "SELECT COUNT (*) FROM [Заказы] WHERE [ПокупательId] = x". Если 0 - удаляем Покупателя, иначе удаляем сначала заказы, а затем Покупателя. Ну или сообщение выдаем.
0
4217 / 3059 / 583
Регистрация: 21.01.2011
Сообщений: 13,203
19.11.2013, 14:58
Цитата Сообщение от Vabos Посмотреть сообщение
SELECT COUNT (*) FROM
Такие вещи не всегда хороши при многопользовательской работе. Есть вероятность, что между SELECT и DELETE ситуация может измениться. Именно поэтому лучше контроль за целостностью отдавать на уровень БД.
0
132 / 129 / 31
Регистрация: 12.12.2011
Сообщений: 463
19.11.2013, 15:00
Имеется ввиду, что это делается между BeginTrans и CommitTrans. А по-хорошему нужно делать встроенные процедуры и каскадное удаление.
0
4217 / 3059 / 583
Регистрация: 21.01.2011
Сообщений: 13,203
19.11.2013, 15:15
Цитата Сообщение от Vabos Посмотреть сообщение
А по-хорошему нужно делать
По хорошему, в реальных учетных системах инфа, введенная в БД, вообще не удаляется (разве что ошибочно введенная). Просто, если она не должна фигурировать в оперативных отчетах, ставится определенный признак. Зато она может понадобится в аналитических отчетах, скажем, продажи за несколько лет.
Поэтому каскадное удаление - штука удобная, но в подобных системах практически не используется.
1
1 / 1 / 3
Регистрация: 26.11.2011
Сообщений: 169
19.11.2013, 19:13  [ТС]
Не каскадное удаление зло)
Ну по крайней мере на мой взгляд. Например пользователь удаляет, и даже подтверждает удаление, а потом опомнится и ту-тю =)

Только вот подскажите правильно ли так проверять ошибку mysql иль нет?

Delphi
1
2
3
4
5
6
7
8
9
try
//Пытаемся произвести удаление
except
    on E: EOleException do
    begin
      if E.ErrorCode = 1451 then
        ShowMessage('Не возможно удалить!');
    end;
end;
На E: EOleException ругается и на E.ErrorCode тоже...

Добавлено через 3 часа 45 минут
Подключил в uses ComObj.
Но результата 0 ...
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
19.11.2013, 19:13
Помогаю со студенческими работами здесь

SQL Server 2000+Delphi7 - Удаление из связанных таблиц
Доброго времени суток всем. Есть две таблицы в SQL Servere 2000 : Clients, Status, Users. Таблица Clients: client_id - int -...

Добавление данных в несколько связанных таблиц и просмотр этих данных на одной форме
Здравствуйте. Задача такая. Заполняю Персону, физическое лицо. таблица Персоны(п_код, наименованиеПолное, НаименованиеСокр, телефон,...

Извлечение данных из связанных таблиц
Всем привет. Опыта у меня не сильно много, поэтому прошу сразу не издеваться)) Дело такое. Нужно вытащить из двух связанных таблиц...

Вывод данных из связанных таблиц в DBGrid
Добрый день. Только начинаю изучать БД, да и с Делфи знаком поверхностно, поэтому не судите строго, если неправильно сформулирован вопрос. ...

Просмотр данных из двух связанных таблиц
В Access есть две таблицы, связанные между собой. В Delphi создал Edit'ы и прилепил к ним некоторые столбцы из 1 и 2 таблицы. Поставил...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
13
Ответ Создать тему
Опции темы

Новые блоги и статьи
Как дизайн сайта влияет на конверсию: 7 решений, которые реально повышают заявки
Neotwalker 08.03.2026
Многие до сих пор воспринимают дизайн сайта как “красивую оболочку”. На практике всё иначе: дизайн напрямую влияет на то, оставит человек заявку или уйдёт через несколько секунд. Даже если у вас. . .
Модульная разработка через nuget packages
DevAlt 07.03.2026
Сложившийся в . Net-среде способ разработки чаще всего предполагает монорепозиторий в котором находятся все исходники. При создании нового решения, мы просто добавляем нужные проекты и имеем. . .
Модульный подход на примере F#
DevAlt 06.03.2026
В блоге дяди Боба наткнулся на такое определение: В этой книге («Подход, основанный на вариантах использования») Ивар утверждает, что архитектура программного обеспечения — это структуры,. . .
Управление камерой с помощью скрипта OrbitControls.js на Three.js: Вращение, зум и панорамирование
8Observer8 05.03.2026
Содержание блога Финальная демка в браузере работает на Desktop и мобильных браузерах. Итоговый код: orbit-controls-threejs-js. zip. Сканируйте QR-код на мобильном. Вращайте камеру одним пальцем,. . .
SDL3 для Web (WebAssembly): Синхронизация спрайтов SDL3 и тел Box2D
8Observer8 04.03.2026
Содержание блога Финальная демка в браузере. Итоговый код: finish-sync-physics-sprites-sdl3-c. zip На первой гифке отладочные линии отключены, а на второй включены:. . .
SDL3 для Web (WebAssembly): Идентификация объектов на Box2D v3 - использование userData и событий коллизий
8Observer8 02.03.2026
Содержание блога Финальная демка в браузере. Итоговый код: finish-collision-events-sdl3-c. zip Сканируйте QR-код на мобильном и вы увидите, что появится джойстик для управления главным героем. . . .
Реалии
Hrethgir 01.03.2026
Нет, я не закончил до сих пор симулятор. Эта задача сложнее. Не получилось уйти в плавсостав, но оно и к лучшему, возможно. Точнее получалось - но сварщиком в палубную команду, а это значит, в моём. . .
Ритм жизни
kumehtar 27.02.2026
Иногда приходится жить в ритме, где дел становится всё больше, а вовлечения в происходящее — всё меньше. Плотный график не даёт вниманию закрепиться ни на одном событии. Утро начинается с быстрых,. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru