Mysql

MySQL - 我們可以在不同的儲存過程中使用相同的臨時表名嗎?

  • June 15, 2019

在我們的數據庫中,我們通過定期呼叫事件中的大量儲存過程來生成統計資訊。

考慮到有兩個SP

  1. auto_update_daily_users
  2. auto_update_daily_orders

temp1在兩個儲存過程中使用相同的臨時表名(比如說)時是否存在衝突?

我檢查了 Stack Overflow 上的問答,他們說臨時表的範圍是目前會話。我認為這意味著當我們將數據庫伺服器與客戶端連接時。

但在我的情況下,所有的 sp 都在伺服器端執行。那麼有人可以解釋一下嗎?

一個SP做完後臨時表會自動銷毀嗎?如果兩個 SP 同時執行會怎樣?他們不是在同一個會話中執行嗎?

在我的情況下,所有的 sp 都在伺服器端執行

任何情況下,SP 都是使用某些客戶端連接(例如,來自 Event Scheduler)執行的。如果它們從某個外部 SP/UDF 中被一一呼叫 - 它們在同一個連接中執行,並且由第一個 SP 創建的臨時表在第二個啟動時存在。如果它們是獨立執行的(例如,作為/來自 2 個單獨的事件過程) - 它們在不同的連接中執行,並且每個都有自己獨立的(本地)臨時表。

伺服器只接受查詢並返回其結果。任何發送查詢並接收其結果的東西都是客戶端。See SHOW PROCESSLIST- 您將看到所有客戶端連接,包括 Event Scheduler 服務連接和已執行事件連接,每個單獨事件的單獨連接。

一個SP做完後臨時表會自動銷毀嗎?

臨時表具有連接範圍。如果您在兩個不同的連接中執行 2 個 SP,則每個 SP 都有自己的臨時表,具有自己的結構和數據,儘管它們的名稱相同。

如果您先執行一個 SP,然後再執行另一個,但在執行第一個後關閉連接並為執行第二個創建新的 - 每個 SP 將再次擁有自己的臨時表。

但是,如果您執行一個 SP,然後在同一連接中執行另一個 SP,則第 1 個創建的臨時表將在第 2 個啟動時存在,數據由第 1 個插入。-秋名

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