php / mysql如何从不同的表中删除具有相同名称的字段

时间:2013-02-14 13:16:47

标签: php mysql sql sql-delete

您好我正在构建我的第一个网站,需要一个声明来删除包含用户指定的Patient_ID的2个表中的任何记录:

我试过了

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 个答案:

答案 0 :(得分: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)");

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

答案 1 :(得分: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);

答案 2 :(得分: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子句的外键约束

答案 3 :(得分:0)

编辑:

正如Mark Ba​​ker在上面的陈述中所指出的,最好的方法是在表上正确定义外键。然而,假设它们不是,它们应该包含在一个事务中。

$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)."'";