Deux tables de même nom dans MySQL


8

J'ai eu ce problème étrange aujourd'hui quand j'ai laissé tomber une table temporaire. J'ai laissé tomber la table temporaire et descendu la table juste pour vérifier. Mais, la table n'a pas été abandonnée. Après quelques recherches, j'ai trouvé que:

MySQL permet de créer une table temporaire du même nom qu'une table permanente. Donc, la table temporaire a été supprimée et non la table permanente. Je suis vraiment confus avec la table sur laquelle je travaille.

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

Voici ce que j'avais testé:

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

Est-ce un bug ou existe-t-il un autre moyen de résoudre ce problème?

Réponses:


6

MySQL vous permet de créer une table temporaire avec un nom existant car ils n'ont pas la même "portée". Une table temporaire est visible uniquement dans la session et elle est supprimée à la fin de la session. Si vous avez le même nom, MySQL "cache" la table d'origine jusqu'à ce que vous supprimiez votre table temporaire.

Vous pouvez vous référer à la section Tables temporaires dans la documentation MySQL

Max.


1
que faire si j'ai besoin d'insérer des enregistrements dans la table permanente lorsque j'ai une table temporaire avec le même nom que la table permanente dans la même session.
BALA

Vous ne pouvez tout simplement pas. Vous devez préfixer votre table ou trouver un nom différent.
Maxime Fouilleul

1
@BALA, Étant donné que les tables temporaires ne doivent pas exister dans une base de données « réel », vous pouvez simplement les mettre dans une base de données « faux », par exemple: create temporary table fake_db.t as select*from t.
Pacerier

1

Dans le manuel ( CRÉER UN TABLEAU ):

Une table TEMPORAIRE n'est visible que pour la session en cours et est supprimée automatiquement lorsque la session est fermée. Cela signifie que deux sessions différentes peuvent utiliser le même nom de table temporaire sans entrer en conflit l'une avec l'autre ou avec une table non TEMPORAIRE existante du même nom. (La table existante est masquée jusqu'à ce que la table temporaire soit supprimée.)

Cela signifie qu'après avoir créé une table temporaire portant le même nom qu'une table existante, vous ne pouvez pas accéder à la table normale par ce nom, mais uniquement à la table temporaire (pendant cette session). Si vous pensez que cela ouvre de l'espace pour une erreur, utilisez un nom différent pour la table temporaire (par exemple, utilisez le préfixe temp_) - c'est simple et ne laisse pas d'espace pour la confusion.


0

Vous avez répondu à cette question dans votre première. Vous n'avez pas " besoin d'insérer des enregistrements dans une table permanente ... même nom .... table temporaire ... même session" car vous avez le contrôle sur les noms de table!

Vous vous assurez simplement que la table temporaire reçoit un préfixe / suffixe tmp _ / _ tmp ou similaire car cela évite toute confusion (comme indiqué par @SpeedyGonsales).

Si vous faites ce genre d'erreur maintenant, pensez à quel point il sera facile de créer une nouvelle personne dans le système dans un an! Votre organisation (même si ce n'est que vous!) Devrait avoir une convention de dénomination , sinon vous obtenez ce type de SNAFU .

En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.