Due tabelle con lo stesso nome in MySQL


8

Ho avuto questo strano problema oggi quando ho lasciato cadere un tavolo temporaneo. Ho lasciato cadere la tabella temporanea e ho descritto la tabella solo per verificarla. Ma il tavolo non è stato lasciato cadere. Dopo alcune ricerche ho scoperto che:

MySQL consente di creare una tabella temporanea con lo stesso nome di una tabella permanente. Quindi il tavolo temporaneo è stato abbandonato e non il tavolo permanente. Mi sono davvero confuso con quale tavolo sto lavorando.

Versione MySQL: 5.1.36-enterprise-gpl-pro-log

Questo è quello che avevo testato:

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

È un bug o esiste un modo alternativo per superarlo?

Risposte:


6

MySQL ti consente di creare una tabella temporanea con un nome esistente perché non hanno lo stesso "ambito". Una tabella temporanea è visibile solo nella sessione e viene eliminata al termine della sessione. Se hai lo stesso nome, MySQL "nasconde" la tabella originale fino a quando non lasci cadere la tabella temporanea.

È possibile fare riferimento alla sezione Tabelle temporanee nella documentazione di MySQL

Max.


1
cosa succede se devo inserire alcuni record nella tabella permanente quando ho una tabella temporanea con lo stesso nome della tabella permanente nella stessa sessione.
BALA,

Semplicemente non puoi. Devi aggiungere il prefisso alla tabella o trovare un nome diverso.
Maxime Fouilleul,

1
@BALA, Dal momento che le tabelle temporanee non hanno bisogno di esistere in un database "reale", si può semplicemente metterli in una banca dati "falso", ad esempio: create temporary table fake_db.t as select*from t.
Pacerier,

1

Dal manuale ( CREATE TABLE ):

Una tabella TEMPORANEA è visibile solo per la sessione corrente e viene rilasciata automaticamente alla chiusura della sessione. Ciò significa che due diverse sessioni possono utilizzare lo stesso nome di tabella temporanea senza essere in conflitto tra loro o con una tabella esistente non temporanea con lo stesso nome. (La tabella esistente viene nascosta fino a quando non viene eliminata la tabella temporanea.)

Ciò significa che dopo aver creato una tabella temporanea con lo stesso nome di una tabella esistente, non è possibile accedere alla tabella normale con quel nome, ma solo quella temporanea (durante quella sessione). Se pensi che apra lo spazio per un errore, usa un nome diverso per la tabella temporanea (ad esempio usa il prefisso temp_) - è semplice e non lascia spazio alla confusione.


0

Hai risposto a questa domanda nel tuo primo. Non è necessario " inserire record in una tabella permanente ... stesso nome .... tabella temporanea ... stessa sessione" perché si ha il controllo sui nomi delle tabelle!

Devi semplicemente assicurarti che alla tabella temporanea venga assegnato un prefisso / suffisso tmp _ / _ tmp o simile in quanto ciò evita qualsiasi confusione (come indicato da @SpeedyGonsales).

Se stai commettendo questo tipo di errore ora, pensa a quanto sarà facile rendere qualcuno nuovo al sistema tra un anno! La tua organizzazione (anche se sei solo tu!) Dovrebbe avere una convenzione di denominazione , altrimenti otterrai questo tipo di SNAFU .

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.