【问题标题】:Check if a row could be deleted in MySQL检查是否可以在 MySQL 中删除行
【发布时间】:2010-09-14 18:37:37
【问题描述】:

有没有一种方法可以检查一行是否可能被删除?例如,它当前没有通过受限制的外键连接到其他任何东西。

原因:我正在创建一个管理页面,其中列出了系统中的所有用户。它们始终可以被禁用,但也可以被删除。但是,只有当它们没有连接到任何关键的东西时,它们才能被删除。如果可以在数据库中轻松完成,我希望不必手动检查。

注意:我不想实际删除任何用户。我只想向管理员显示一个用户可以被删除。

【问题讨论】:

  • 尝试删除它。如果数据库抱怨,那是不可能的。 ;)
  • 您始终可以通过先删除连接的东西然后删除管理员来删除管理员。
  • 嗯,是的,但是它已经被删除了,这可能是也可能不是管理员想要的:p我只想显示它是否有可能。

标签: mysql foreign-keys delete-row


【解决方案1】:

您可以尝试将其作为事务的一部分删除,如果成功则回滚该事务。但是,我想紧随其后的问题是,您为什么不知道是否可以删除该行?

【讨论】:

  • 因为它可能通过外键附加各种限制,我不想手动检查所有这些限制,因为如果我稍后添加或删除表,它们可能会发生变化。跨度>
  • 那你的业务逻辑有问题。这种类型的验证应该在您的业务层中完成,这将执行必要的查询以确保用户没有连接到任何东西。
  • 认为数据完整性和这样的检查是外键限制的目的吗?
  • 如果有人正在构建一个数据库管理器(如 PhpMyAdmin),用户可以在其中创建自己的表和外键(以及他们自己的业务逻辑故障),他可能会遇到这个问题,对于那些构建东西的人就像这个答案可能很有用。
【解决方案2】:

您可以使用视图来汇总依赖项的数量,而不必担心存储数据并使其保持最新。当依赖项的数量为零时,在 UI 中使删除选项可用...

【讨论】:

    【解决方案3】:

    您可以通过左连接到它们所连接的表来获取所有孤立的行,例如这将为您提供所有没有任何工作的用户 ID。

    SELECT u.id FROM users u LEFT JOIN jobs j on u.id=j.user_id WHERE j.user_id is null;
    

    【讨论】:

      【解决方案4】:
      猜你喜欢
      • 1970-01-01
      • 2015-04-25
      • 1970-01-01
      • 1970-01-01
      • 2013-10-23
      • 1970-01-01
      • 2020-02-20
      • 1970-01-01
      • 2019-03-28
      相关资源
      最近更新 更多