我正在使用angular和php构建项目,我有一个"客户"我可以检索所有数据的表,但删除一行时遇到问题。如果"客户"有"订单",我无法删除(行)"客户"。如果"客户" dosn没有"命令",我可以删除没有问题。这是我得到的错误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>
答案 0 :(得分:3)
您的架构受到约束,要求您在删除客户之前删除所有客户的订单。只要客户保留任何订单,MySQL就不会让您删除客户。
删除客户行的业务含义是什么?许多客户跟踪系统不会删除这样的行;相反,他们会添加Question:
列,并在客户不再有效时将其设置为零。实际上,删除具有订单历史记录的客户可能会在您尝试调解内容时造成混淆,可能在年底。
如果要清理开发或测试数据库,只需在删除客户行之前删除订单行。
如果您使用的是最近的MySQL版本,则可以在约束的定义中指定active
为shown here。但这是一个粗略的方法。
答案 1 :(得分:2)
您可以向表中添加CascadeDelete,以便在删除父记录时也会删除子记录。您还可以编写代码以使用所选客户的密钥字段首先删除后台订单,然后删除客户。但Angular不会覆盖您的数据库约束。