【发布时间】: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