如何使用一个sql命令同时从一个或多个表中删除

时间:2017-09-08 13:36:56

标签: mysql database sql-update

我有三张桌子(非政府组织,工作人员和财务)。如果删除该非数据数据,我想删除特定非政府组织的所有员工和财务数据。现在,我将分别在这些表中添加数据:首先,添加所有ngos;第二,加上非政府组织的所有工作人员;第三,添加非政府组织的所有资金。

现在,让我们说我只添加了非工作人员和工作人员,后来改变主意从两个表中删除信息,而无需进一步增加财务。

$qry =mysqli_query($mysqli, "
    update ngo, finance, staff 
    set ngo.deletestatus=('delete'), 
        finance.deletestatus=('delete'),
        staff.deletestatus=('delete')
    where ngo.ngo_id=finance.ngo_id
        and ngo.ngo_id=staff.ngo_id 
        and ngo.ngo_id='".$_GET['delet']."'");

此查询未运行,因为财务表为空。即使一个表为空,我仍然希望删除操作使用相同的脚本生效。请帮忙!!

2 个答案:

答案 0 :(得分:0)

您需要修复数据库设计以允许级联删除/更新。这就是你如何做到的:

CREATE TABLE ngos (
    id int unsigned not null primary key,
    name VARCHAR(255) default null
);

CREATE TABLE ngostaff (
    ngo_id int unsigned not null,
    staff_id int unsigned not null,
    name VARCHAR(255) default null,
    FOREIGN KEY (ngo_id) REFERENCES ngos (id)
       ON DELETE CASCADE
       ON UPDATE CASCADE
);

CREATE TABLE ngofinance (
    ngo_id int unsigned not null,
    finance_id int unsigned not null,
    name VARCHAR(255) default null,
    FOREIGN KEY (ngo_id) REFERENCES ngos (id)
       ON DELETE CASCADE
       ON UPDATE CASCADE
);

从ngo表中删除行将自动删除引用它的任何行。

答案 1 :(得分:0)

对于它的价值,您不会删除,您只需设置deletestatus列以指示不使用该数据。有些人称之为"软删除。"

但我理解这个问题。您正在表之间进行连接以查找要更新的匹配行,但如果其中一个表没有匹配的数据,则该连接没有任何内容可匹配,并且它也会跳过第一个表中的行。

最简单的解决方案是进行三次更新。您还应该使用bind参数来防止SQL注入。

if ($stmt = mysqli_prepare($mysqli, "
    update ngo set deletestatus = 'delete' where ngo_id=?")) {
    mysqli_stmt_bind_param($stmt, "s", $_GET["delet"]);
    mysqli_stmt_execute($stmt);
    mysqli_stmt_close($stmt);
}
if ($stmt = mysqli_prepare($mysqli, "
    update finance set deletestatus = 'delete' where ngo_id=?")) {
    mysqli_stmt_bind_param($stmt, "s", $_GET["delet"]);
    mysqli_stmt_execute($stmt);
    mysqli_stmt_close($stmt);
}
if ($stmt = mysqli_prepare($mysqli, "
    update staff set deletestatus = 'delete' where ngo_id=?")) {
    mysqli_stmt_bind_param($stmt, "s", $_GET["delet"]);
    mysqli_stmt_execute($stmt);
    mysqli_stmt_close($stmt);
}

使用循环可能会更容易一些:

foreach (["ngo", "finance", "staff"] as $tablename) {
    if ($stmt = mysqli_prepare($mysqli, "
        update `$tablename` set deletestatus = 'delete' where ngo_id=?")) {
        mysqli_stmt_bind_param($stmt, "s", $_GET["delet"]);
        mysqli_stmt_execute($stmt);
        mysqli_stmt_close($stmt);
    }
}