Ameer111 Ответов: 3

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


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

таблица 1

проекты

ПК параметр projectid

таблица 2

студенты

ООО " ПК " Регно ФК Таблица 3 параметр projectid

прогресс ФК Регно

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

Что я уже пробовал:

$query = "

        DELETE students, progress from students inner join progress on progress.RegNo=students.RegNo where students.ProjectID='$id';
        DELETE FROM projects where projects.ProjectID='$id'; 
";

//$conn->exec($query);
$stmt = $conn->prepare($query); $stmt->execute();


это дает нарушение ограничения внешнего ключа

3 Ответов

Рейтинг:
0

Richard Deeming

Вариант 1:
Установите внешний ключ для каскадирования при удалении:
MySQL ON DELETE CASCADE: удаление данных из нескольких таблиц[^]

Вариант 2:
Удалите данные из всех связанных таблиц вручную:

DELETE FROM progress FROM progress INNER JOIN students ON progress.RegNo = students.RegNo WHERE students.ProjectID = :id;
DELETE FROM students WHERE students.ProjectID = :id;
DELETE FROM projects WHERE projects.ProjectID = :id;

NB: Используйте параметры для передачи значений в запрос, а не для вставки значений непосредственно в строку. Если вы этого не сделаете, вы можете сделать свой код уязвимым для SQL-инъекций.

Все, что вы хотели знать о SQL-инъекции (но боялись спросить) | Трой Хант[^]
Как я могу объяснить SQL-инъекцию без технического жаргона? | Обмен Стеками Информационной Безопасности[^]
Шпаргалка по параметризации запросов | OWASP[^]
PHP: SQL-инъекция - руководство пользователя[^]
РНР: Подготовленные инструкции и хранимые процедуры - руководство пользователя[^]


Рейтинг:
0

Patrice T

$query = "
        DELETE students, progress from students inner join progress on progress.RegNo=students.RegNo where students.ProjectID='$id';
        DELETE FROM projects where projects.ProjectID='$id'; 
";

Не решение вашего вопроса, а еще одна проблема, которая у вас есть.
Никогда не создавайте SQL-запрос путем объединения строк. Рано или поздно вы сделаете это с помощью пользовательских вводов, и это откроет дверь к уязвимости под названием "SQL-инъекция", она опасна для вашей базы данных и подвержена ошибкам.
Одна кавычка в имени - и ваша программа выйдет из строя. Если пользователь вводит имя, например "Брайан О'Коннер", может привести к сбою вашего приложения, это уязвимость SQL-инъекции, и сбой-это наименьшая из проблем, вредоносный пользовательский ввод, и он продвигается к командам SQL со всеми учетными данными.
SQL-инъекция - Википедия[^]
SQL-инъекция[^]
Атаки SQL-инъекций на примере[^]
PHP: SQL-инъекция - руководство пользователя[^]
Шпаргалка по предотвращению инъекций SQL - OWASP[^]
Как я могу объяснить SQL-инъекцию без технического жаргона? - Обмен Стеками Информационной Безопасности[^]


Рейтинг:
0

Member 12687631

Для удаления данных мы просто используем команду delete MySQL.
Но если мы хотим удалить данные ссылочной таблицы автоматически, в то время как мы удаляем данные из родительской таблицы, то для этого мы используем функцию MySQL cascade.

Предположим, у меня есть 2 таблицы.
1 - родитель
2 - Ребенок

И я хочу удалить ссылочные данные из дочерней таблицы автоматически, если я удаляю данные из родительской таблицы. Поэтому для этого мы используем ON DELETE cascade of MySQL.

Оформить заказ полный пример на
https://www.javadream.in/mysql-cascade-on-delete-and-on-update-cascade-example/