本问题已经有最佳答案,请猛点这里访问。
我正在从多个表中的dB中删除数据。我正在使用模态将数据用户名发送到delete-member.php,以确认(删除),如下所示:
$('.delete-button').on('click', function (e) {
var username = $(this).attr('data-id');
$('.confirm-delete').attr('data-id',username);
});
$(".confirm-delete").on('click', function (e) {
var username = $(this).attr('data-id');
console.log(username);
//Ajax for deleting category
$.ajax({
url: 'handlers/delete_member.php',
type: 'GET',
data: {username: username},
error: function() {
alert('Something went wrong');
},
success: function(data) {
console.log("Member Deleted");
}
});
location.href="site_members.php?username="+username;
});
此处一切正常,我$_GET用户名并删除数据。我面临的挑战是该特定用户使用该系统已有一段时间了。为了对该用户进行硬删除,我需要执行mk。确保在多个表中删除了username。确切地说是15。
使用准备好的语句,我着手删除每次出现的内容,如下所示:
if(isset($_GET["username"])) {
$userFromURL = $_GET["username"];
//delete member information from users
global $con;
$delete_mbrQ = mysqli_prepare($con,"DELETE FROM users WHERE username=?");
$delete_mbrQ->bind_param("s", $userFromURL);
$delete_mbrQ->execute();
$delete_mbrQ->close();
//delete member posts
$delete_postsQ = mysqli_prepare($con,"DELETE FROM posts WHERE added_by=?");
$delete_postsQ->bind_param("s", $userFromURL);
$delete_postsQ->execute();
$delete_postsQ->close();
//delete messages
$del_msgsQ = mysqli_prepare($con,"DELETE FROM messages WHERE user_to=? OR user_from=?");
$del_msgsQ->bind_param("ss", $userFromURL, $userFromURL);
$del_msgsQ->execute();
$del_msgsQ->close();
等等...(我不会全部放15张,但是您的要领)我对发生username的所有15张桌子都这样做了,并且效果很好。但是,看看这大段重复代码,我想知道是否有更有效的方法来做到这一点?我可以将其合并为一个或两个语句来实现相同的目的吗?
我一直在对此进行研究,但是我读过的大多数书都更多地讨论了设置外键的问题,在某些情况下我已经做了,但显然并非如此。对于预准备语句和列名不同的实例,我也找不到很多。任何帮助,示例,链接等,将不胜感激。
您可以使用MySQL联接; inner join(或left join)
使用上面的示例,您可以构造单个SQL查询,该查询使用联接查询将各种表组合在一起,并删除这些联接中的所有结果。
DELETE users, posts, messages FROM users
INNER JOIN posts
ON posts.added_by = users.username
INNER JOIN messages
ON messages.user_to = users.username OR messages.user_from = users.username
WHERE users.username= ?
这应该可以满足您的需要,但是对于15个表,如果索引设置不正确,则很容易变得更加混乱,并且可能会更慢。
资料来源:
http://www.mysqltutorial.org/mysql-delete-join/
如何从MySQL中的多个表中删除?
也...
为了保持MySQL的效率,您可以简单地将PHP预处理语句包装成一个循环并针对每个表运行该循环,具体取决于表的设置方式,这似乎很容易,但仅在大多数情况下如此。某些重复可能仍然存在。
...在新表delete_table中使用外键,该表引用了所有其他15个表中该行的出现,然后只需从delete_table中删除并观察删除级联!
谢谢你 我试图理解您建议的解决方案:将我的" Prepared Statements"包装在一个循环中,然后按表运行它。 您是说while(something) {all of my prepared statements}吗?
@Raylene是的,有点,但是如果所有表中的列名称username都相同并且?的计数相同,它将完全起作用,但这在某些迭代中看起来是这样的…… ..可以完成,但是需要更多的循环例外编码
知道了。 好,谢谢。
在MySQL中,您可以在列上定义一个外键,一旦引用的行被删除,它就会级联删除操作。参见https://dev.mysql.com/doc/refman/8.0/en/create-table-foreign-keys.html
您可以更改posts表,以使added_by列成为外键,这意味着其值标识引用表中的行。删除users表中的行后,数据库必须对posts表中所有引用已删除的用户行的行进行操作,以保持一致性。如果已删除用户存在任何post实例,则可以选择不允许删除,也可以指示在发生这种情况时也删除所有post实例。您可以使用以下语句来做到这一点:
ALTER TABLE posts ADD FOREIGN KEY (added_by) REFERENCES users (username) ON DELETE CASCADE
OP已经提到了外键,以及他们希望如何在没有外键的情况下找到另一种变体来做同样的事情