我有三张桌子(非政府组织,工作人员和财务)。如果删除该非数据数据,我想删除特定非政府组织的所有员工和财务数据。现在,我将分别在这些表中添加数据:首先,添加所有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']."'");
此查询未运行,因为财务表为空。即使一个表为空,我仍然希望删除操作使用相同的脚本生效。请帮忙!!
答案 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);
}
}