MySQL中两个具有相同名称的表


8

今天,我放下一张临时桌子时遇到了这个奇怪的问题。我删除了临时表,然后对表进行了描述以进行验证。但是,该表未删除。经过一番搜索,我发现:

MySQL允许创建一个与永久表同名的临时表。因此临时表被删除,而不是永久表。我对正在使用哪张桌子感到非常困惑。

MySQL版本:5.1.36-enterprise-gpl-pro-log

这是我测试过的:

mysql> create table test(id int);
Query OK, 0 rows affected (0.00 sec)

mysql> desc test;

| Field | Type    | Null | Key | Default | Extra |
--------------------------------------------------
 id       int(11)   YES           NULL

 mysql> create temporary table test(id int);
 Query OK, 0 rows affected (0.00 sec)



mysql> desc test;

| Field | Type    | Null | Key | Default | Extra |
--------------------------------------------------
 id       int(11)   YES           NULL


mysql> drop table test;
 Query OK, 0 rows affected (0.00 sec)

 mysql> desc test;

| Field | Type    | Null | Key | Default | Extra |
--------------------------------------------------
 id       int(11)   YES           NULL

这是一个错误还是有其他方法可以克服这个问题?

Answers:


6

MySQL允许您使用现有名称创建一个临时表,因为它们没有相同的“作用域”。临时表仅在会话中可见,并且在会话结束时将其删除。如果您使用相同的名称,则MySQL将“隐藏”原始表,直到删除临时表为止。

您可以参考MySQL文档中的“ 临时表”部分

最高


1
如果我有一个与同一会话中的永久表同名的临时表,如果我需要在永久表中插入一些记录该怎么办?
BALA 2014年

你根本做不到。您必须在表前添加前缀或查找其他名称。
Maxime Fouilleul 2014年

1
@BALA,由于临时表不需要存在于“真实”数据库中,因此您只需将它们放入“假”数据库中即可,例如:create temporary table fake_db.t as select*from t
Pacerier,2015年

1

从手册(CREATE TABLE)中:

TEMPORARY表仅对当前会话可见,并且在关闭会话时会自动将其删除。这意味着两个不同的会话可以使用相同的临时表名称,而不会彼此冲突或与现有的具有相同名称的非TEMPORARY表冲突。(在删除临时表之前,现有表一直处于隐藏状态。)

这意味着在创建一个与某些现有表同名的临时表后,您将无法使用该名称访问普通表,而只能访问临时表(在该会话期间)。如果您认为这会为错误打开空间,请为临时表使用其他名称(例如,使用prefix temp_)-这很简单,不会造成混淆。


0

您已经在第一个回答了这个问题。不“ 需要插入记录在一个永久表...同名....临时表......同一个会话”,因为必须在表名控制!

您只需确保为临时表指定了前缀/后缀tmp _ / _ tmp或类似名称,因为这样可以避免任何混淆(如@SpeedyGonsales所指)。

如果您现在正在犯这种错误,那么请考虑一下,一年之内使刚接触该系统的人变得多么容易!您的组织(即使只有您自己!)也应该有一个命名约定,否则您将得到这种SNAFU

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.