Zwei gleichnamige Tabellen in MySQL


8

Ich habe dieses seltsame Problem heute bekommen, als ich einen temporären Tisch fallen ließ. Ich habe die temporäre Tabelle gelöscht und die Tabelle nur zur Überprüfung heruntergefahren. Aber der Tisch wurde nicht fallen gelassen. Nach einigem Suchen fand ich Folgendes:

Mit MySQL kann eine temporäre Tabelle mit demselben Namen wie eine permanente Tabelle erstellt werden. Also wurde die temporäre Tabelle gelöscht und nicht die permanente Tabelle. Ich war wirklich verwirrt mit dem Tisch, an dem ich arbeite.

MySQL-Version: 5.1.36-Enterprise-GPL-Pro-Log

Folgendes hatte ich getestet:

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

Ist das ein Fehler oder gibt es eine alternative Möglichkeit, dies zu überwinden?

Antworten:


6

Mit MySQL können Sie eine temporäre Tabelle mit einem vorhandenen Namen erstellen, da diese nicht denselben "Gültigkeitsbereich" haben. Eine temporäre Tabelle ist nur in der Sitzung sichtbar und wird am Ende der Sitzung gelöscht. Wenn Sie denselben Namen haben, "versteckt" MySQL die ursprüngliche Tabelle, bis Sie Ihre temporäre Tabelle löschen.

Sie können auf den Abschnitt Temporäre Tabellen in der MySQL-Dokumentation verweisen

Max.


1
Was ist, wenn ich einige Datensätze in die permanente Tabelle einfügen muss, wenn ich eine temporäre Tabelle mit demselben Namen wie die permanente Tabelle in derselben Sitzung habe?
BALA

Das kannst du einfach nicht. Sie müssen Ihrer Tabelle ein Präfix voranstellen oder einen anderen Namen finden.
Maxime Fouilleul

1
@BALA, Da temporäre Tabellen nicht in einer "echten" Datenbank vorhanden sein müssen, können Sie sie einfach in eine "gefälschte" Datenbank einfügen, z create temporary table fake_db.t as select*from t.
Pacerier

1

Aus dem Handbuch ( CREATE TABLE ):

Eine TEMPORARY-Tabelle ist nur für die aktuelle Sitzung sichtbar und wird automatisch gelöscht, wenn die Sitzung geschlossen wird. Dies bedeutet, dass zwei verschiedene Sitzungen denselben temporären Tabellennamen verwenden können, ohne miteinander oder mit einer vorhandenen nicht temporären Tabelle mit demselben Namen in Konflikt zu geraten. (Die vorhandene Tabelle wird ausgeblendet, bis die temporäre Tabelle gelöscht wird.)

Das heißt, nachdem Sie eine temporäre Tabelle mit demselben Namen wie eine vorhandene Tabelle erstellt haben, können Sie nicht über diesen Namen auf die normale Tabelle zugreifen, sondern nur über die temporäre Tabelle (während dieser Sitzung). Wenn Sie der Meinung sind, dass dadurch Platz für einen Fehler entsteht, verwenden Sie einen anderen Namen für die temporäre Tabelle (z. B. Präfix verwenden temp_) - das ist einfach und lässt keinen Raum für Verwirrung.


0

Sie haben diese Frage in Ihrer ersten beantwortet. Sie nicht „ Notwendigkeit Aufzeichnungen in einer permanenten Tabelle ... gleiche Namen .... temporäre Tabelle ... gleiche Sitzung einfügen“ , weil Sie die Kontrolle über die Tabellennamen haben!

Sie stellen einfach sicher, dass die temporäre Tabelle ein Präfix / Suffix tmp _ / _ tmp oder ähnliches erhält, da dies Verwirrung vermeidet (wie von @SpeedyGonsales angegeben).

Wenn Sie jetzt einen solchen Fehler machen, denken Sie daran, wie einfach es sein wird, in einem Jahr jemanden zu finden, der neu im System ist! Ihre Organisation (auch wenn das nur Sie sind!) Sollte eine Namenskonvention haben , sonst erhalten Sie diese Art von SNAFU .

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.