【问题标题】:Is there any way to tell if a database row has constraints?有什么方法可以判断数据库行是否有约束?
【发布时间】:2014-04-18 23:43:17
【问题描述】:

我将 Perl DBI 与 PostgreSQL 一起使用,我的用户将从表中删除行,其中一些由于外键约束而无法删除,这很好,但我想要一种标记这些行的方法在前端,以便在尝试删除它们之前知道哪些行有约束。现在,用户只需点击“删除”,就会出现错误或删除该行。

【问题讨论】:

  • 这正是约束的意图。存在约束是因为数据模型必须以一种或另一种方式强加。仅仅因为你想删除一些记录而“点击删除”是没有意义的。 Ergo:应用程序应该了解数据模型。例如:如果您尝试“删除”一个人,并且该人的婚姻记录存在,那么婚姻记录应该如何处理?
  • @wildplasser 不确定我是否遵循,似乎 OP 在询问如何找到约束,以便用户甚至看不到执行他们被限制执行的任务的选项。
  • 恕我直言,应用程序应该与数据库和数据模型有密切的关系。这可以通过(应用程序)目录来实现,但应用程序应该知道模型。一种方式或另一种方式。在任何情况下,“删除记录”都不是一种选择。如果 it 是预期的操作,则应实施。一种或另一种方式。
  • @GoatCO:数据库和应用程序之间有一个隐藏的“合同”。 “找到约束”(通常)不是强加合同的方式。
  • 好吧,我猜你根本不明白这个问题。

标签: sql perl postgresql dbi


【解决方案1】:

我对 PostgreSQL 不是很熟悉,但我相信你可以使用:

SELECT * 
FROM information_schema.table_constraints 
WHERE table_name = 'YourTable'

更新-在这里看起来像是一个可靠的答案: Postgres: SQL to list table foreign keys

【讨论】:

  • 是的,其他数据库中也有类似的东西。
  • 我试过了,它只告诉我内部约束(主键列和唯一列)。与外键无关。
  • 我从您提供的链接中复制/粘贴了 SQL 语句,只更改了表名,它不返回任何内容。我应该改变其他东西吗?
  • @DanGoodspeed 这可能意味着您正在查看的表上没有外键,如果您只使用它会返回任何内容:WHERE tc.table_name='mytable';
  • 肯定有限制。这是一个用户表,如果我尝试删除一个发表评论的用户(或来自大量其他不同站点活动的任何内容),它会返回一个 SQL 外键约束错误。您是说将 WHERE constraint_type = 'FOREIGN KEY' AND tc.table_name='auth_users' 更改为 WHERE tc.table_name='auth_users'?我进行了更改并获得了与您的原始评论相同的结果(主键列和唯一列)。
【解决方案2】:

所以我自己想通了。对于任何有类似情况的人,您都可以开启交易

$dbh->{AutoCommit} = 0;

然后尝试删除该行,例如这样......

my $sth = $dbh->prepare("DELETE FROM auth_users WHERE username = ?");
$sth->execute($username);

然后检查错误...

if ( $sth->err ) { print "CAN'T be deleted.";}
else { print "CAN be deleted.";}

然后只是回滚不提交删除,以防它可能被删除......

$dbh->rollback;

这对我有用。如果有人对此方法有任何更好的想法或有任何疑问,请随时分享。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-05-30
    • 1970-01-01
    • 2019-10-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-04-27
    相关资源
    最近更新 更多