我读了一篇文章(https://www.red-gate.com/simple-talk/sql/t-sql-programming/temporary-tables-in-sql-server/),关于SQL Server如何区分两个具有相同名称但在2个不同连接中创建的临时表。他们通过向下划线字符左边填充的每个本地临时表名添加数字字符串来实现。
我想知道MySQL如何处理上述情况(在两个本地连接中创建两个具有相同名称的临时表)?它是否像SQL一样使用相同的方法?
答案 0 :(得分:2)
MySQL通过为表生成唯一的伪随机文件名来内部处理临时表。以下是MyISAM引擎的一个示例:
mysql> create temporary table test.foo (i int) engine=myisam;
mysql> exit
现在让我们看看在MySQL的tmpdir中创建了什么:
$ ls /var/folders/zz/zyxvpxvq6csfxvn_n000009800002_/T/
#sql6f_200000013_2.MYD #sql6f_200000013_2.MYI
我尝试使用临时InnoDB表进行此测试,但该存储引擎不会创建可见文件(至少不是我现在安装的8.0.3版本)。我想临时表是在系统表空间ibdata1
中创建的。
MySQL有一些逻辑表名test.foo
的内部映射到相应的物理表名称。这样,即使其他会话具有相同名称的表,每个会话也可以拥有自己的不同表。
答案 1 :(得分:2)
这取决于表引擎,我使用InnoDB和MyISAM创建了两个表
MyISAM 使用操作系统上的临时文件夹,检查我的本地配置中的系统变量fp = r"\Data\Exercise2\addresses.txt"
data = pd.read_csv(fp, sep=';')
是否设置为:tmpdir
,所以当我创建一个临时表时创建随机命名文件:
/tmp
该文件包含表定义文件(frm)表数据和索引(MYD和MYI)
InnoDB 引擎使用包含其他引擎内部的单个文件,但表定义也是在ubuntu:~$ ll /tmp/#*
-rw-r----- 1 mysql mysql /tmp/#sql4c0_6_1.frm
-rw-r----- 1 mysql mysql /tmp/#sql4c0_6_1.MYD
-rw-r----- 1 mysql mysql /tmp/#sql4c0_6_1.MYI
路径中创建的:
tmpdir
数据和索引存储在ubuntu:~$ ll /tmp/#*
-rw-r----- 1 mysql mysql /tmp/#sql4c0_6_0.frm <-- InnoDB
-rw-r----- 1 mysql mysql /tmp/#sql4c0_6_1.frm <-- MyISAM
-rw-r----- 1 mysql mysql /tmp/#sql4c0_6_1.MYD <-- MyISAM
-rw-r----- 1 mysql mysql /tmp/#sql4c0_6_1.MYI <-- MyISAM
中,路径与系统变量/path/to/mysql/ibfileX