链接MySQL数据库中的行并使用PHP查询

时间:2015-11-19 19:33:59

标签: php mysql hyperlink row

我刚刚用PHP完成了我的第一个网站,我现在才注意到一个问题。我的很多动态内容都“链接”到其他表中的行。因此,当删除其他表中的那些行时,它显然会给我一个错误。

例如,我有一个表“book_groups”,它从表“books”,“hosts”和“locations”中提取数据。因此,在查询某个book_group之后,我根据与该组一起存储的book_id,host_id和location_id对其他表进行了更多查询。

我显然计划不够好。因为如果一本书被意外删除然后重新添加,那么id将会改变并且它将被破坏。

我的问题是,解决这个问题的最佳方法是什么,因为我已经完成了这一切?我可以回到每个查询并添加一个if($ query_result!= false)来查看该行是否仍然存在。但是男人有很多疑问,因为我有很多不同类型的群组和相关的表格。

为了将来参考,是否有更好的方法来链接MySQL中的表而不是仅存储相关表行的id?

1 个答案:

答案 0 :(得分:0)

您的主题是参考完整性。在MySQL中,您可以通过数据库触发器强制执行此类完整性。

例如,您可以定义在父记录上发生delete之前执行的触发器:

CREATE TRIGGER trg_books_bef_delete
    BEFORE DELETE
    ON books
    FOR EACH ROW
BEGIN
    DELETE FROM book_groups WHERE book_id = old.book_id;
END;

此特定触发器将删除引用正在删除的book_groups记录的book中的所有相关记录。

您可以决定采用不同的方式进行响应,并在删除具有相关记录的book记录时引发错误。从MySQL 5.5开始,您可以这样做:

CREATE TRIGGER trg_books_bef_delete
    BEFORE DELETE
    ON books
    FOR EACH ROW
BEGIN
    IF (SELECT COUNT(*) FROM book_groups WHERE book_id = old.book_id) > 0
    THEN
       SIGNAL SQLSTATE '45000' SET MESSAGE_TEXT = 'Foreign Key Constraint Violated!';
    END IF;
END;

在这种情况下,如果找到引用正在删除的book_groups记录的book记录,则会引发严重异常,并取消delete操作。

您可以使用MySql here了解参照完整性。

您可以在PHP中执行类似的操作,但是当通过其他工具(例如phpAdmin)连接时,可以绕过此类代码。触发器的优点是它们独立于您连接的位置执行,并且它们在与主操作相同的事务中执行。缺点是您需要在php代码旁边维护另一层代码。并且php代码必须知道这些触发器可能具有的其他表的副作用。

delete中执行book php的受控$confirmed = false; if (isset($_POST["confirm"])) { $confirmed = true; } $book_id = $_POST["book_id"]); $con = mysqli_connect(...); // Check for dependent records that would also be deleted: if ($stmt = mysqli_prepare($con, "SELECT COUNT(*) AS cnt FROM book_groups WHERE book_id = ?")) { mysqli_stmt_bind_param($stmt, "i", $book_id); mysqli_stmt_execute($stmt); mysqli_stmt_bind_result($stmt, $cnt); mysqli_stmt_fetch($stmt); mysqli_stmt_close($stmt); if ($cnt > 0 && !$confirmed) { ?> <html> <body> <form action="" method="post"> <input type="hidden" name="book_id" value="<?=$book_id?>"/> This book is categorised in groups, are you sure to delete that information? <input type="submit" value="confirm" name="confirm"/> </form> </body> </html> <?php exit; } } // continue to delete book below... 的一些想法:

Parse.User.current().fetch().then(function (user) {
    console.log(user.get('imagePicture'));
});