无法删除一个表中在另一个表中具有相应相关值的条目

Posted

技术标签:

【中文标题】无法删除一个表中在另一个表中具有相应相关值的条目【英文标题】:Cannot delete entries in a table that have corresponding related values in another table 【发布时间】:2019-03-31 16:58:53 【问题描述】:

作为餐厅管理网站的一部分,我正在尝试更新和删除一些项目。 restaurant 表具有主键 rest_id 并使用此键链接到餐厅 items 表。

当我尝试删除餐厅中未填充 items 中相应项目的条目时,我的代码有效。但是,当餐厅的条目在items 表中有一些记录时,删除查询什么也不做,只是刷新页面。

我正在尝试删除restaurantitems 表中的所有记录。也就是说,如果一家餐馆被删除,我希望它的项目也被删除。

//Update.php
<?php
    $con = mysqli_connect("127.0.0.1","root","toor");
    mysqli_select_db($con, 'eatrebs');
    $id = isset($_POST['id']) ? $_POST['id'] : '';
    $name = isset($_POST['rname']) ? $_POST['rname'] : '';
    $email = isset($_POST['email']) ? $_POST['email'] : '';
    $address = isset($_POST['address']) ? $_POST['address'] : '';
    if(isset($_POST['del']))
    
        if ($sql = mysqli_prepare($con,"DELETE FROM restaurant where restaurant.rest_id = ?"))
            $sql -> bind_param("s",$id);
            $sql -> execute ();
            $sql -> close();
            header('refresh:1; url="index.php"');
        
        else
            echo"No update";
        
    
    else
        if ($sql = mysqli_prepare($con,"UPDATE restaurant SET rest_name = ?,email=?, address=? WHERE rest_id = ?"))
            $sql ->bind_param("ssss", $name, $email, $address, $id);
            $sql -> execute();
            $sql -> close();
            header('refresh:1; url="index.php"');
        
        else
            echo "No update";
        
    




?>




//index.php

<html>
    <head>
         <link rel="stylesheet" href="https://maxcdn.bootstrapcdn.com/bootstrap/3.4.0/css/bootstrap.min.css">
        <link rel="stylesheet" href="https://maxcdn.bootstrapcdn.com/bootstrap/3.4.0/css/bootstrap.css">

        <script src="https://ajax.googleapis.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>


        <script src="https://maxcdn.bootstrapcdn.com/bootstrap/3.4.0/js/bootstrap.min.js"></script>
        <link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/4.7.0/css/font-awesome.min.css">
        <link rel="stylesheet" href="popup.css">
        <link rel="stylesheet" href="PopupSearch.css">
        <script src="popup.js"></script>
        <script src="PopupSearch.js"></script>
        <meta charset="UTF-8">
        <title>Owner's view</title>
    </head>
    <body>
        <?php
        //Connect to mysql db
        $con = mysqli_connect('127.0.0.1','root','toor');
        //select database
        mysqli_select_db($con,'eatrebs');
        //Select query
        $sql = "SELECT * FROM restaurant";
        //Execute query
        $records = mysqli_query($con,$sql);

        ?>
        <table>
            <h1 align="left">
                Restaurant Listings
                <button class="btn">
                    <i class="fa fa-bars"></i>
                </button>
            </h1>
            <Hr>
            <div id="Listingsblock">
            <thead>
            <tr>
            <div id="Listing_Labels">
            <th class="text-center">Restaurant Name</th>
            <th class="text-center">Email</th>
            <th class="text-center">Address</th>
            </tr>
            </div>
            </thead>
            <tbody>
        <?php
        while ($row = mysqli_fetch_array($records))
        

            echo '<tr><form action="update.php" method="post">';
            echo"<input type=hidden name=id value='".$row['rest_id']."'></td>";
            echo "<td><input type = text name = \"rname\"  value = '".$row['rest_name']."'</td>";
            echo "<td><input type = text name = \"email\"  value = '".$row['email']."'</td>";
            echo "<td><input type = text name = \"address\"  value = '".$row['address']."'</td>";
            echo"<td><input type=submit value=\"Update\">";
            echo'<td><Button btn btn-primary btn-lg pull-left name=del>Delete</Button>';
            echo "</form>";

            echo '<form action="Menu/viewMenu.php" method="post">';
            echo"<input type=hidden name=iid value='".$row['rest_id']."'></td>";
            echo"<td><input type=submit value=\"View Menu\" name=viewMenu>";
            echo'</form></tr>';

        
        $a = mysqli_num_rows($records);
        if($a==0)
            echo'<h1>No Records Available</h1>';

        


        ?>
            </tbody>
            </table>
        <hr>
        <hr>
        </div>
        <!--Insert Records-->
        <h1 align="left">
            Create new Listing
            <button type="button" class="btn btn-default btn-sm" onclick="openForm()">
                <span class="glyphicon glyphicon-plus-sign"></span> Plus
            </button>
        </h1>
        <br>
        <!--create entry popup-->






        <div class="form-popup" id="myForm">
            <form action="create.php" class="form-container" method="post">
            <h1>Register</h1>

            <label for="rname2"><b>Restaurant Name</b></label>
            <input type="text" placeholder="Enter Restaurant Name" name="rname2" required>

            <label for="email2"><b>Email</b></label>
            <input type="text" placeholder="Enter email" name="email2" required>

            <label for="address2"><b>Address</b></label>
            <input type="text" placeholder="Enter Address" name="address2" required>

            <button type="submit" class="btn">Register</button>
            <button type="button" class="btn cancel" onclick="closeForm()">Close</button>
          </form>

        </div>
  <hr>
        <hr>
</body>
</html>

【问题讨论】:

【参考方案1】:

首先,您丢弃了数据库查询的响应。

您应该抓住这一点并采取相应的行动。 mysqli_stmt::execute() 成功时返回 true,失败时返回 false。如果它失败了,你可能应该用它的error() 做点什么。这将让您通过显示错误消息来解释正在发生的事情来避免“我的页面刚刚刷新”。

其次,您的数据库正在保护您。它希望您的数据格式正确,如果您删除另一个记录引用的记录,它不知道应该做什么。最安全的做法,在很多情况下也是正确的做法,就是拒绝删除引用的记录。

不过,您可以更改此行为。当您add your constraint 时,您可以提供ON DELETE 子句,例如

ALTER TABLE item
  ADD CONSTRAINT restaurant_fk
  FOREIGN KEY (rest_id)
  REFERENCES restaurant(id)
  ON DELETE CASCADE;

这里,ON DELETE CASCADE 告诉您的数据库,当它们对应的 restaurants 被删除时,它应该删除 items。

在添加此约束之前,您必须删除旧约束。这取决于它当前的配置方式,但类似于

ALTER TABLE item
  DROP FOREIGN KEY whatever_its_name_is;

应该可以解决问题。

【讨论】:

非常感谢!但是,假设我想保持数据完整性,同时仍然摆脱餐馆。这样做的最佳方法是什么?我需要重组我的数据库吗? 确实维护数据完整性。它会删除否则会引用缺失值的记录。您能否更具体地说明在这种情况下您希望发生什么?阅读我在答案中链接的“添加约束”页面可能是一个好主意。它列出了您的选项。看看reference_options。

以上是关于无法删除一个表中在另一个表中具有相应相关值的条目的主要内容,如果未能解决你的问题,请参考以下文章

Codeigniter 从一个数据库表中获取数据并用它在另一个表中创建一个条目的麻烦

如何在父表中满足相应条件的相关模型中插入条目

显示一个表中的条目数,对于 SQL 中两个表共享的键,同时还包括在另一个表中没有位置的条目

删除记录而不删除另一个 Access 表中的相关记录

使用 Sequelize 包含子句查询在另一个表中没有条目的记录

在表中找到两条具有相同值的记录