Duas tabelas com o mesmo nome no MySQL


8

Recebi esse problema estranho hoje quando deixei cair uma mesa temporária. Larguei a mesa temporária e desci a mesa apenas para verificar. Mas, a mesa não foi descartada. Após algumas pesquisas, descobri que:

O MySQL permite criar uma tabela temporária com o mesmo nome que uma tabela permanente. Portanto, a tabela temporária caiu e não a tabela permanente. Fiquei realmente confuso com a tabela em que estou trabalhando.

Versão do MySQL: 5.1.36-enterprise-gpl-pro-log

Isto é o que eu testei:

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

Isso é um bug ou existe uma maneira alternativa de superar isso?

Respostas:


6

O MySQL permite que você crie uma tabela temporária com um nome existente porque eles não têm o mesmo "escopo". Uma tabela temporária é visível apenas na sessão e é descartada no final da sessão. Se você tem o mesmo nome, o MySQL "oculta" a tabela original até você soltar sua tabela temporária.

Você pode consultar a seção Tabelas Temporárias na documentação do MySQL

Máx.


11
e se eu precisar inserir alguns registros na tabela permanente quando tiver uma tabela temporária com o mesmo nome da tabela permanente na mesma sessão.
BALA

Você simplesmente não pode. Você deve prefixar sua tabela ou encontrar um nome diferente.
Maxime Fouilleul

11
@BALA, Desde tabelas temporárias não precisa existir em um banco de dados "real", você pode simplesmente colocá-los em um banco de dados "fake", por exemplo: create temporary table fake_db.t as select*from t.
Pacerier

1

No manual ( CREATE TABLE ):

Uma tabela TEMPORÁRIA é visível apenas para a sessão atual e é descartada automaticamente quando a sessão é fechada. Isso significa que duas sessões diferentes podem usar o mesmo nome de tabela temporária sem conflitar entre si ou com uma tabela não TEMPORÁRIA existente com o mesmo nome. (A tabela existente fica oculta até que a tabela temporária seja descartada.)

Isso significa que, depois de criar uma tabela temporária com o mesmo nome de alguma tabela existente, você não pode acessar a tabela normal com esse nome, mas apenas a temporária (durante a sessão). Se você acha que isso abre espaço para um erro, use um nome diferente para a tabela temporária (por exemplo, use prefixo temp_) - isso é simples e não deixa espaço para confusão.


0

Você respondeu a esta pergunta no seu primeiro. "Você não precisa inserir registros em uma tabela permanente ... mesmo nome ... tabela temporária ... mesma sessão" porque você tem controle sobre os nomes das tabelas!

Você simplesmente garante que a tabela temporária receba um prefixo / sufixo tmp _ / _ tmp ou semelhante, pois isso evita qualquer confusão (conforme referido por @SpeedyGonsales).

Se você está cometendo esse tipo de erro agora, pense em como será fácil para alguém novo no sistema daqui a um ano! Sua organização (mesmo que seja apenas você!) Deve ter uma convenção de nomes , caso contrário, você recebe esse tipo de SNAFU .

Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.