Mysql

截斷臨時表送出事務?

  • August 14, 2020

“CREATE TEMPORARY TABLE IF NOT EXISTS..”不送出目前事務(我喜歡這樣),但是臨時的 TRUNCATE TABLE 隱式送出任何事務,這是正確的嗎?

這是否意味著在不送出目前事務的情況下擁有一個新的臨時表的唯一方法是執行(在上面的 DDL 語句之後):

從臨時表名中刪除;

這種 TRUNCATE 自動送出行為在我的應用程序中引起了一個相當討厭的錯誤——由於“TRUNCATE 障礙”,回滾並沒有一直向上;)

確實CREATE TEMPORARY TABLE IF NOT EXISTS..是 DDL,但你知道它 TRUNCATE TABLE本身也是 DDL嗎???這些年來,我已經多次提到這一點……

TRUNCATE TABLE 上的MySQL 文件說明如下:

儘管 TRUNCATE TABLE 類似於 DELETE,但它被歸類為 DDL 語句而不是 DML 語句。在 MySQL 5.6 中,它與 DELETE 的不同之處在於:

  • 截斷操作刪除並重新創建表,這比逐行刪除要快得多,特別是對於大型表
  • 截斷操作會導致隱式送出,因此無法回滾
  • 如果會話持有活動表鎖,則無法執行截斷操作。
  • 如果引用該表的其他表存在任何 FOREIGN KEY 約束,則對於 InnoDB 表或 NDB 表,TRUNCATE TABLE 將失敗。允許在同一個表的列之間進行外鍵約束。
  • 截斷操作不會為已刪除的行數返回有意義的值。通常的結果是“0 行受影響”,這應該被解釋為“沒有資訊”。
  • 只要表格式文件 tbl_name.frm 有效,即使數據或索引文件已損壞,也可以使用 TRUNCATE TABLE 將表重新創建為空表。
  • 任何 AUTO_INCREMENT 值都會重置為其起始值。即使對於通常不重用序列值的 MyISAM 和 InnoDB 也是如此。
  • 當與分區表一起使用時,TRUNCATE TABLE 保留分區;也就是說,數據和索引文件被刪除並重新創建,而分區定義 (.par) 文件不受影響。
  • TRUNCATE TABLE 語句不呼叫 ON DELETE 觸發器。

所以,要回答你的問題,你處理它的方式是唯一的方法。

引用自:https://dba.stackexchange.com/questions/146031