【问题标题】:I can't delete records from MySql我无法从 MySql 中删除记录
【发布时间】:2011-02-27 08:42:18
【问题描述】:

我有两张桌子。表 a 参考表 b 我相信。

当我尝试像这样一起删除包时:

$query="DELETE a, b FROM classified as a, $sql_table as b WHERE a.ad_id = '$id' 
AND a.classified_id = b.classified_id AND a.poster_password='$pass'";

我猜必须先删除b。 即使在 PhpMyAdmin 中,如果 b 还在,我也无法删除 a,所以我先删除 b。

但是什么决定了先到的顺序呢?

这些表都是 InnoDB。

我该怎么办?

谢谢

【问题讨论】:

  • 之所以引用键是这样的,是因为我在显示我的记录时使用了 JOIN...你知道的。

标签: php sql mysql html database


【解决方案1】:

MySQL manual 表示多表删除和外键:

如果您使用多表 DELETE 涉及 InnoDB 表的语句 哪些有外键 约束,MySQL 优化器可能 按顺序处理表 不同于他们的 父子关系。在这个 情况下,语句失败并滚动 背部。相反,您应该从 单个表并依赖于 ON 删除 InnoDB 的功能 规定使其他表 进行相应的修改。

这样当你的主表中的记录被删除时,它的外部引用也会被删除,例如:

ALTER TABLE products
  ADD CONSTRAINT fk_supplier
      FOREIGN KEY (supplier_id, supplier_name)
      REFERENCES supplier(supplier_id, supplier_name)
      ON DELETE CASCADE;

【讨论】:

    【解决方案2】:

    您的 Delete 语法无效。您需要在两个语句中执行此操作(除非 nuqqsa 提到,您在表 a 和表 b 之间的关系上启用了 CASCADE DELETE):

    Delete From b
    Where Exists    (
                    Select 1
                    From a
                    Where a.poster_password = '$pass'
                        And a.ad_id = '$id'
                        And a.classified_id = b.classified_id
                    )
    
    Delete From a
    Where a.poster_password = '$pass'
        And a.ad_id = '$id'
    

    决定哪个先出现的是外键关系。无论哪个表是父表,都必须从上一个表中删除。

    【讨论】:

    • 我猜你是 SQL Server 用户?
    • @simplemotives - 我?我是,但是上面的语法等效于任何数据库产品。
    • @Thomas - 你的 SQL 风格就是我评论的全部。
    • @simplemotives - Np。虽然,我曾与 Oracle 合作过,而且我使用相同的风格。
    • Thomas:看看这个 Q,我无法让上面的代码正常工作:stackoverflow.com/questions/2972796/…
    猜你喜欢
    • 1970-01-01
    • 2014-10-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-04-06
    • 1970-01-01
    相关资源
    最近更新 更多