91超碰碰碰碰久久久久久综合_超碰av人澡人澡人澡人澡人掠_国产黄大片在线观看画质优化_txt小说免费全本

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

MySQL中怎么創建和刪除臨時表

發布時間:2021-07-26 11:07:21 來源:億速云 閱讀:629 作者:Leah 欄目:數據庫

這篇文章將為大家詳細講解有關MySQL中怎么創建和刪除臨時表,文章內容質量較高,因此小編分享給大家做個參考,希望大家閱讀完這篇文章后對相關知識有一定的了解。

1.介紹:

MySQL臨時表,屬于session級別,當session退出時,臨時表被刪除。臨時表允許與其他表同名,并單獨維護在thd的結構體中;因此,不同的session可以創建同名的臨時表,并且只操作自己擁有的臨時表;

創建臨時表的語法很簡單:

root@test 03:26:44>show create table tmp1\G

*************************** 1. row ***************************

       Table: tmp1

Create Table: CREATE TEMPORARY TABLE `tmp1` (

  `a` int(11) NOT NULL AUTO_INCREMENT,

  `b` int(11) DEFAULT NULL,

  `c` int(11) DEFAULT NULL,

  PRIMARY KEY (`a`)

) ENGINE=InnoDB DEFAULT CHARSET=latin1

1 row in set (0.00 sec)

當創建臨時表后,會在tmp文件夾下生成兩個文件:

#sql3e95_1a_0.frm

#sql3e95_1a_0.ibd

那么MySQL本身究竟是如何創建和刪除臨時表的呢?

2.創建

執行SQL:

CREATE TEMPORARY TABLE `tmp1` (   `a` int(11) NOT NULL AUTO_INCREMENT,   `b` int(11) DEFAULT NULL,   `c` int(11) DEFAULT NULL,   PRIMARY KEY (`a`) );

1)斷點:ysql_execute_command

_execute_command:

2205      switch (lex->sql_command) {

(gdb)

2532        if (!(lex->create_info.options & HA_LEX_CREATE_TMP_TABLE))

(gdb) p lex->create_info.options          --------if語句里為false

$2 = 1

          create_table_precheck------檢查是否具有創建表的權限,以及表名在全局鏈表上是否已存在(臨時表無需檢查)

          append_file_to_dir     ------Fix names if symlinked tables

           if (select_lex->item_list.elements)               -------------------當為create ....select這樣的語句時select_lex->item_list.elements為非0值,這里我們只考慮簡單的情況

                 if ((result= new select_create))

                           res= handle_select(thd, lex, result, 0);

           else

               (1)mysql_create_like_table           ---------------create table like...類似的語句

               (2)mysql_create_table                 ---------------主要分析這個函數

2)斷點:mysql_create_table

mysql_create_table

       mysql_create_table_no_lock

             check_engine

             file = get_new_handler

3842      set_table_default_charset(thd, create_info, (char*) db);

3844      if (mysql_prepare_create_table(thd, create_info, alter_info,

3854      path_length= build_tmptable_filename(thd, path, sizeof(path));   -----創建臨時表文件名:#sql{進程id}_{thread_id}_{當前線程的臨時表整數標識thd->tmp_table}               

3978      rea_create_table --------------------------------------------------------------------創建frm文件和ibd文件

3986      open_temporary_table-------------------------------------------------------------打開臨時表

                            (1)構建table和table_share結構體

                            (2)將table結構體加入到thd->temporary_tables鏈表中

4009      error= write_create_table_bin_log----------------------------------------------寫入binlog

3.刪除臨時表

手動執行 drop table tmp1

mysql_execute_command

      case SQLCOM_DROP_TABLE:

            mysql_rm_table

                mysql_rm_table_part2

                          for (table= tables; table; table= table->next_local)

                                     drop_temporary_table-----------------------------從thd->temporary_tables上查找臨時表           

                                                           調用close_temporary_table來關閉、刪除臨時表文件,并從thd->temporary_tables上刪除相應節點

                                     if (!drop_temporary)-------------------------------當刪除的是非臨時表時,執行下面的邏輯

----------------------------------------

4. 當session退出時。

看看堆棧:

Breakpoint 16, rm_temporary_table (base=0xc8c560, path=0x1427c10 "/u01/mysql-5148.stock/tmp/#sql3e95_1d_0") at sql_base.cc:5634

5634    bool rm_temporary_table(handlerton *base, char *path)

(gdb)

5641      strmov(ext= strend(path), reg_ext);

(gdb) bt

#0  rm_temporary_table (base=0xc8c560, path=0x1427c10 "/u01/mysql-5148.stock/tmp/#sql3e95_1d_0") at sql_base.cc:5641

#1  0x00000000005f6eaa in close_temporary (table=0x1427030, free_share=true, delete_table=true) at sql_base.cc:1928

#2  0x00000000005f725f in close_temporary_tables (thd=0x14065f0) at sql_base.cc:1549

#3  0x0000000000592d9b in THD::cleanup (this=0x14065f0) at sql_class.cc:967

#4  0x00000000005a3579 in unlink_thd (thd=0xc8c560) at mysqld.cc:1858

#5  0x00000000005a35dc in one_thread_per_connection_end (thd=0xc8c560, put_in_cache=16) at mysqld.cc:1945

#6  0x00000000005ac208 in handle_one_connection (arg=0x14065f0) at sql_connect.cc:1141

#7  0x0000003e638064a7 in start_thread () from /lib64/libpthread.so.0

#8  0x0000003e630d3c2d in clone () from /lib64/libc.so.6

#9  0x0000000000000000 in ?? ()

在session結束的時候,會調用THD::cleanup來做臨時表的清理工作

關于MySQL中怎么創建和刪除臨時表就分享到這里了,希望以上內容可以對大家有一定的幫助,可以學到更多知識。如果覺得文章不錯,可以把它分享出去讓更多的人看到。

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

蓬莱市| 资中县| 高青县| 双柏县| 西和县| 河东区| 榕江县| 哈密市| 长阳| 星座| 镇赉县| 徐闻县| 巴中市| 南城县| 金门县| 江西省| 本溪| 栾城县| 扎囊县| 南康市| 六盘水市| 太仆寺旗| 德安县| 若羌县| 望都县| 天津市| 偏关县| 文化| 元氏县| 佛坪县| 邻水| 改则县| 莱州市| 巴彦淖尔市| 读书| 万州区| 临武县| 交城县| 错那县| 安阳县| 偏关县|