Php 从表1中删除和表2中关联的记录

Php 从表1中删除和表2中关联的记录,php,mysql,double,Php,Mysql,Double,我试图做一个简单的决定,从数据库中删除记录。 我有一个带有记录和唯一ID的主表,它是自动递增的 然后我有第二个表,它存储与第一个表中的ID相关联的值(可能不止一个) 例如: table1 editors ID (autoincrement) EditorName 然后我有第二张桌子,上面有: table2 ID editorID (same ID as table1) bookname 因此,我想知道这样做是如何从表1(示例ID=2)中删除一条记录的最好方法,它会自动删除表2中editorI

我试图做一个简单的决定,从数据库中删除记录。 我有一个带有记录和唯一ID的主表,它是自动递增的

然后我有第二个表,它存储与第一个表中的ID相关联的值(可能不止一个)

例如:

table1
editors
ID (autoincrement)
EditorName
然后我有第二张桌子,上面有:

table2
ID
editorID (same ID as table1)
bookname
因此,我想知道这样做是如何从表1(示例ID=2)中删除一条记录的最好方法,它会自动删除表2中editorID=2的所有记录


我尝试过很多方法,但除非我做两个查询,否则它们似乎不起作用,但我不喜欢这种方式。有更聪明的方法吗?它必须是通过代码,否则我可以在SQL中关联两个表,它们通过ID和editorID关联?

创建一个外键来链接这两个表

在这两个表之间定义一个外键,并让MySQL知道在删除编辑器时何时级联:

CREATE TABLE editors (
  ID int(11) NOT NULL AUTO_INCREMENT,
  EditorName varchar(255) NOT NULL,
  PRIMARY KEY (ID)
)engine=InnoDB;

CREATE TABLE edits (
  ID int(11) NOT NULL AUTO_INCREMENT,
  bookname varchar(255) NOT NULL,
  editorID int(11) NOT NULL,
  PRIMARY KEY (ID),
  KEY editorID (editorID),
  CONSTRAINT edits_ibfk_1 
  FOREIGN KEY (editorID) 
  REFERENCES editors (ID) 
  ON DELETE CASCADE
)engine=InnoDB;
看看这个

DELETE table1
FROM table1
INNER JOIN table2 ON table1.ID = table2.editorID
WHERE table1.ID = 2;
解决方案#1:

如果您在
table2
中有外键约束,它指的是
table1
ID
具有
删除级联
行为,那么从
table1
中删除记录将从
table2
中删除相应的条目

解决方案#2:

您可以使用
JOIN

DELETE T1,T2
FROM table1 AS T1
INNER JOIN table2 AS T2 ON T1.ID = T2.editorID
WHERE T1.ID = 2;
  DELETE T1,T2
  FROM table1 AS T1
  LEFT JOIN table2 AS T2 ON T1.ID = T2.editorID
  WHERE T1.ID = 2;


编辑:

为了从
表1
表2
中删除条目,无论
表2中是否存在相应条目
,您需要将
内部联接
替换为
左联接

DELETE T1,T2
FROM table1 AS T1
INNER JOIN table2 AS T2 ON T1.ID = T2.editorID
WHERE T1.ID = 2;
  DELETE T1,T2
  FROM table1 AS T1
  LEFT JOIN table2 AS T2 ON T1.ID = T2.editorID
  WHERE T1.ID = 2;

我同意这是不够的,但他有正确的想法。我添加了一个代码示例来演示这一点。使用触发器也可以工作,但与只设置外键相比,设置起来很困难。@DaveChen设置触发器有多困难?问题中,触发器在哪里引用了生成此答案的父子关系。哦,还有一个逗号不见了,我的错。这个问题涉及到编辑和书籍编辑。表1包含所有编辑器,表2包含所有编辑。所有编辑都属于一个编辑器,因此父/子关系不是吗?如果表1和表2有值,我可以购买@DaveChen my badIt works。假设只有表1有值。因为我想删除这两个,所以它不会删除,因为表2没有vlaues。有什么办法吗?只需将
内部连接
替换为
左连接
。请检查编辑部分下的更新答案@蒂亚戈