【问题标题】:Truncate table with constraint in postgresql with php用php在postgresql中截断带有约束的表
【发布时间】:2014-04-06 01:19:22
【问题描述】:

我有一个表格,可以从 rss-feed 获取数据。我需要在导入之前截断数据库表,这样我就没有任何不在 rss-feed 中的“旧”条目。

但是当我尝试截断时,我收到一个错误duplicate key value violates unique constraint

我已尝试寻找答案,但找不到任何人解释如何使用 php 进行操作。

我的旧代码:

try {
    $db->beginTransaction();
    $stmt = $db->prepare("TRUNCATE TABLE loans_bank REUSE STORAGE");
    $stmt->execute();
    
    $db->commit();
} catch(PDOException $ex) {
    //Something went wrong rollback!
    $db->rollBack();
    echo $ex->getMessage();
}    

这是我得到的错误:

SQLSTATE[42601]: Syntax error: 7 ERROR:  syntax error at or near "REUSE"
LINE 1: TRUNCATE TABLE loans_bank REUSE STORAGE
                                      ^PHP Fatal error:  Uncaught exception 'PDOException' with message 'SQLSTATE[23505]: Unique violation: 7 ERROR:  duplicate key value violates unique constraint "loans_bank_pkey"
DETAIL:  Key (id)=(358976) already exists.' in /home/USER/import/get_bank.php:66
Stack trace:
#0 /home/USER/import/get_bank.php(66): PDOStatement->execute(Array)
#1 {main}
  thrown in /home/USER/import/get_bank.php on line 66

我试过了:

try {
    $db->beginTransaction();
    $stmt = $db->prepare("ALTER TABLE loans_bank DISABLE CONSTRAINT loans_bank_pkey");
    $stmt = $db->prepare("TRUNCATE TABLE loans_bank REUSE STORAGE");
    $stmt = $db->prepare("ALTER TABLE loans_bank ENABLE CONSTRAINT loans_bank_pkey");
    $stmt->execute();
    
    
    $db->commit();
} catch(PDOException $ex) {
    //Something went wrong rollback!
    $db->rollBack();
    echo $ex->getMessage();
}    

但我得到了同样的错误。在截断表格时应该如何禁用关系?

编辑 1:

如果我尝试:

try {
    $db->beginTransaction();
    $stmt = $db->prepare("TRUNCATE TABLE $table");
    $stmt->execute();
    
    
    $db->commit();
} catch(PDOException $ex) {
    //Something went wrong rollback!
    $db->rollBack();
    echo $ex->getMessage();
}    

我收到此错误:

SQLSTATE[0A000]: Feature not supported: 7 ERROR:  cannot truncate a table referenced in a foreign key constraint
DETAIL:  Table "loans_loan500" references "loans_bank".
HINT:  Truncate table "loans_loan500" at the same time, or use TRUNCATE ... CASCADE.PHP Fatal error:  Uncaught exception 'PDOException' with message 'SQLSTATE[23505]: Unique violation: 7 ERROR:  duplicate key value violates unique constraint "loans_bank_pkey"
DETAIL:  Key (id)=(358976) already exists.' in /home/USER/import/get_bank.php:69
Stack trace:
#0 /home/USER/import/get_bank.php(69): PDOStatement->execute(Array)
#1 {main}
  thrown in /home/USER/import/get_bank.php on line 69

【问题讨论】:

  • 你试过TRUNCATE TABLE loans_bank CASCADE吗?
  • 但是连接的其他表会怎样,如果我使用 CASCADE 会被删除吗?
  • 记录将被删除,就像DELETE CASCADE一样,基于约束和关系。
  • 其他表不会被删除,只会删除你的loans_bank表中匹配键的条目,如果你正确设置表应该没问题
  • 但我不想这样!我有其他表有不同的贷款产品,如果我做 CASCADE,我所有的产品也会被删除!有没有办法只是暂时禁用这种关系?

标签: php postgresql php-pgsql


【解决方案1】:

DROP STORAGE 和 REUSE STORAGE 仅出于兼容性考虑;子句被解析并忽略

试试

TRUNCATE TABLE loans_bank

【讨论】:

  • 更新了我在没有REUSE STORAGE的情况下得到的错误问题
猜你喜欢
  • 2019-11-04
  • 2020-12-12
  • 2016-07-28
  • 1970-01-01
  • 1970-01-01
  • 2011-07-24
  • 2020-09-07
相关资源
最近更新 更多