首页 文章

INNER JOIN - Mysql和PHP

提问于
浏览
0

我在mysql的内连接方面遇到了一些问题 .

我有以下代码:

DELETE T1,T2 FROM table1 AS T1 INNER JOIN table2 AS T2 ON T1.id = T2.pageid WHERE T1.ID = 2

这里的问题是如果表2中没有任何内容可以删除 .

例如,如果table1和table2具有ID 2,则它们都删除它们 . 如果table1中只有ID 2,则不会删除table1中的记录 .

我已经尝试使用外键但它也不起作用:

CREATE TABLE banners (
  id int(11) NOT NULL AUTO_INCREMENT,
  username TEXT NOT NULL,
  pageid int(11) NOT NULL,
  sitename TEXT NOT NULL,
  imgurl TEXT NOT NULL,
  refurl TEXT NOT NULL,
  clicks int(11) NOT NULL,
  PRIMARY KEY (id),
  KEY pageid (pageid),
  CONSTRAINT edits_ibfk_1 
  FOREIGN KEY (pageid) 
  REFERENCES pages (id) 
  ON DELETE CASCADE
)

如果我使用SQL:

DELETE FROM banners WHERE id= ?

它只删除table1和左table2记录那里:(

我更喜欢用SQL查询来做到这一点 . 在这种情况下有人可以帮助我吗?谢谢!

2 回答

  • 1
    • 使用左连接而不是内连接(t1似乎是父表) . 左连接从左表中获取所有记录,无论您在右表中有多少匹配记录 .

    • 如果使用外键,则从父表中删除,而不是从子项中删除以触发级联删除 . Banner 表是您的子表,页面是父表,因为 Banner 引用了页表 . 从子项中删除记录不会影响父表 .

  • 1

    根据您的描述,您的 banners 表(table1)似乎依赖于表2 .

    表1的外键引用表2,但表2“不关心”表1(表1是独立实体) . 从表1中删除项目时,数据完整性不会被破坏,因为没有其他实体引用表1中的特定行 .

    如果删除了表2(页面)中的行, ON DELETE CASCADE 将生效 . Banner 表中引用已删除行的行也将被删除 .

    换句话说,如果父项被删除, ON DELETE CASCADE 也将删除子项 . 但是,如果删除了一个孩子,父母将保持原状 .

    您需要验证此父子关系是否正确 . 如果 banners 应该是 pages 的子项,则需要将外键列移动到 pages 表 . 然后,您的第二个查询将导致删除子项 pages ,以及指定的 banner .

    如果您当前的架构正确,则只需删除父级 pages ,即可删除子级 banners .

相关问题