1

嗨,我正在建立我的第一个网站,需要一个语句来删除 2 个包含用户指定的 Patient_ID 的表中的任何记录:

我试过了

mysql_query("DELETE FROM appointment 
  WHERE Patient_ID='$patid'
  UNION
  DELETE FROM patient 
  WHERE Patient_ID='$patid'");

并且

  mysql_query("DELETE FROM appointment INNER JOIN patient 
  WHERE Patient_ID='$patid'");

非常感谢您对此的帮助!

提前致谢

4

4 回答 4

4

我宁愿StoredProcedure为两个删除语句做一个。

DELIMITER $$
CREATE PROCEDURE DeletePatient(IN PatientID INT)
BEGIN
    DELETE FROM appointment WHERE Patient_ID = PatientID;
    DELETE FROM patient WHERE Patient_ID = PatientID;
END $$
DELIMITER ;

在你的 php 脚本上,

mysql_query("CALL DeletePatient($patid)");

作为旁注,SQL Injection如果变量的值(s)来自外部,则查询很容易受到攻击。请看下面的文章,了解如何预防。通过使用PreparedStatements,您可以摆脱在值周围使用单引号。

于 2013-02-14T13:19:35.940 回答
1

简单的

mysql_query("DELETE FROM appointment WHERE Patient_ID='$patid'");
mysql_query("DELETE FROM patient WHERE Patient_ID='$patid'");

不要忘记首先格式化您的 $patid:

$patid = mysql_real_escape_string($patid);
于 2013-02-14T13:19:25.070 回答
1

可以在一个查询中执行:

$query = "DELETE FROM appointment, patient USING patient INNER JOIN appointment ON (patient.patient_id = appointment.patient_id) WHERE patient.patient_id = '" . intval($patid) . "'";

但是,为了保持数据完整性,最好的选择是在您的appointment表上定义一个外键约束,该约束引用您的patient表并包含一个ON DELETE CASCADE子句。

于 2013-02-14T13:21:22.587 回答
0

编辑:

正如马克贝克在上述声明中指出的那样,最好的方法是在表上正确定义外键。然而,假设它们不是,它们应该被包装到一个事务中。

$query1 = "DELETE FROM appointment WHERE Patient_ID='".intval($patid)."'";
$query2 = "DELETE FROM patient WHERE Patient_ID='".intval($patid)."'";

mysql_query("START TRANSACTION", $yourConnection); 
mysql_query("BEGIN", $yourConnection); 
mysql_query($query1, $yourConnection); 
mysql_query($query2, $yourConnection); 
mysql_query("COMMIT", $yourConnection); 

原答案:

执行此操作的唯一方法是运行两个单独的 DELETE 命令。

$query1 = "DELETE FROM appointment WHERE Patient_ID='".intval($patid)."'";
$query2 = "DELETE FROM patient WHERE Patient_ID='".intval($patid)."'";
于 2013-02-14T13:19:21.597 回答