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

0

Я строю проект с угловым и php, у меня есть таблица "Customers", в которой я могу получить все данные, но у меня есть проблема с удалением одной строки. если у "Заказчика" есть "Заказы", я не могу удалить (строку) "Клиент". если у "Заказчика" нет "заказов", я могу удалить без проблем. Это ошибка, которую я получаю на phpmyadmin = # 1451. Не удается удалить или обновить родительскую строку: ограничение внешнего ключа завершается с ошибкой. может ли кто-нибудь помочь?

PHP-код для удаления:

<?php
 header('Content-Type: text/html; charset=utf-8');
$connect=mysqli_connect("localhost", "root", "", "hamatkin");

  include_once 'Customer.php';
mysqli_query($connect,"SET character_set_client = utf8");
mysqli_query($connect,"SET character_set_connection = utf8");
mysqli_query($connect,"SET character_set_results = utf8");
// Check connection
if (mysqli_connect_errno()) {
  echo "Failed to connect to MySQL: " . mysqli_connect_error();
}
$data = json_decode(file_get_contents("php://input"));
$x=$data->customer_id;
 $customer_id = $data->customer_id;
$del = "DELETE FROM customers WHERE customer_id=".$customer_id;
   mysqli_query($connect, $del);
 }
$newURL = "/hamatkin/#/customerCards";
header('Location: '.$newURL);
?>

контроллер:

  $scope.delete = function(deletingId, $index) {

       var params = $.param({"customer_id":deletingId});
      $http.post('api/customers-tab/delete-customer.php',{"customer_id":deletingId})
          .success(function(data){
           var arr=JSON.parse(JSON.stringify(data));
            $scope.customerDetails = arr;
             var arr2 = arr.split(",");
              arr2.splice($index, 1);
              $route.reload();
        });
      }

html-код:

<tr ng-repeat="x in customers | filter:search_query | orderBy: order_query:reverse_query">

            <td>{{ x.customer_id}}</td>
            <td>{{ x.kind_Of_Customer}}</td>
            <td>{{ x.full_name}}</td>                <td> {{ x.id}} </td>
            <td> {{ x.city}} </td>

            <td><a href="/hamatkin/index.html#/customerCardDetails/{{ x.customer_id}}"  class="btn btn-primary btn- active">הצג פרטי לקוח </a></td>

            <td><a ng-click="delete(x.customer_id, $index)"  class="btn btn-primary btn- active">מחיקה</td>
  • 3
    помочь с чем? вы пытаетесь сделать что-то, что нарушает ограничение в вашей базе данных. либо убери ограничение, либо повинуйся ему. И обратите внимание, что вы уязвимы для атак инъекций SQL
  • 0
    @MarcB больше ничего, что я могу сделать?
Показать ещё 8 комментариев
Теги:

2 ответа

3

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

Каков бизнес-смысл удаления строки клиента? Многие системы отслеживания клиентов не удаляют такие строки; вместо этого они добавляют active столбец и устанавливают его на ноль, когда клиент больше не активен. Фактически удаление клиента с историей заказа может вызвать путаницу, когда вы пытаетесь согласовать материал, возможно, в конце года.

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

Если вы используете последнюю версию MySQL, вы можете указать ON DELETE CASCADE в определении вашего ограничения, как показано здесь. Но это отрывочный путь.

  • 0
    хорошо, большое спасибо!
2

Вы можете добавить CascadeDelete в свою таблицу, чтобы при удалении родительской записи дети также удалялись. Вы также можете написать код, чтобы использовать поле ключа у выбранного Клиента, чтобы сначала удалить заказы в фоновом режиме, а затем удалить Клиента. Но Angular не отменяет ограничений базы данных.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню