簡體   English   中英

無法截斷外鍵約束中引用的表

[英]Cannot truncate a table referenced in a foreign key constraint

無法截斷外鍵約束中引用的表。 我應該先做什么才能啟用截斷?

細節:

(
    `guacamole`.`guacamole_connection_history`, 
    CONSTRAINT `guacamole_connection_history_ibfk_2` 
    FOREIGN KEY (`connection_id`) 
    REFERENCES `guacamole`.`guacamole_connection` (`connection_id`)
)

我想清除 guacamole_connection 表以進行開發測試。

數據庫結構

您可以通過跳過外鍵檢查來進行截斷。

SET FOREIGN_KEY_CHECKS = 0; 
TRUNCATE table1; 
SET FOREIGN_KEY_CHECKS = 1;

TRUNCATE 它不等同於 DELETE:TRUNCATE 它是 DDL 操作,而 DELETE 是 DML 操作。 換句話說,TRUNCATE 會改變表結構(即根據您正在處理的 RDBMS 釋放存儲空間並修改其他屬性),而 DELETE 只是在執行模型指定的每個驗證時修改數據(即前鍵約束、檢查約束等) .)

為什么要截斷表格? 嗯,它更快,因為它不必運行任何驗證(這就是為什么您的 FK 會影響截斷操作),並允許您釋放表(及其索引)當前分配的所有空間。

所以,如果你想截斷你的表,你應該:

  1. DISABLE 相關 FK
  2. 截斷所有相關表。
  3. 啟用以前禁用的 FK

在內部,操作使用(再次取決於 RDBMS)相當於 DROP 和 CREATE FK。 差異通常與所需的權限有關,因為從概念上講,創建/刪除 FK 與啟用/禁用它不同

為什么不添加一個約束添加ON DELETE CASCADEON UPDATE CASCADE 然后你需要做的就是TRUNCATE guacamole_connection CASCADE

例子:

ALTER TABLE 
    guacamole_connection_history 
ADD CONSTRAINT 
    guacamole_connection_history_cascade_delete 
    FOREIGN KEY (connection_id) 
    REFERENCES guacamole_connection (connection_id) 
    ON UPDATE CASCADE ON DELETE CASCADE;

然后只需運行TRUNCATE guacamole_connection CASCADE

確保首先從任何依賴表中刪除條目。 例如:

 TRUNCATE TABLE guacamole_connection_history;
 TRUNCATE TABLE guacamole_connection;

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM