web-dev-qa-db-ja.com

MySQLの同じ名前の2つのテーブル

今日、一時テーブルを削除したときに、この奇妙な問題が発生しました。確認のために一時テーブルを削除し、テーブルを記述しました。しかし、テーブルは削除されませんでした。いくつか検索した後、私はそれを発見しました:

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

これはバグですか、これを克服する別の方法がありますか?

8
BALA

MySQLでは、同じ「スコープ」を持たないため、既存の名前で一時テーブルを作成できます。一時テーブルはセッションでのみ表示され、セッションの終了時に削除されます。同じ名前の場合、MySQLは一時テーブルを削除するまで元のテーブルを「非表示」にします。

MySQLドキュメント一時テーブルセクションを参照できます。

マックス。

6

マニュアルから( CREATE TABLE ):

TEMPORARYテーブルは現在のセッションでのみ表示され、セッションが閉じられると自動的に削除されます。これは、2つの異なるセッションが互いに、または同じ名前の既存の非TEMPORARYテーブルと競合することなく、同じ一時テーブル名を使用できることを意味します。 (既存のテーブルは、一時テーブルが削除されるまで非表示になります。)

つまり、既存のテーブルと同じ名前の一時テーブルを作成した後は、その名前では通常のテーブルにアクセスできず、一時セッションのみにアクセスできます(そのセッション中)。エラーのためにスペースが開くと思われる場合は、一時テーブルに別の名前を使用してください(例:プレフィックスtemp_を使用)-これは簡単で、混乱のためにスペースを残しません。

1
stemd

あなたは最初の質問でこの質問に答えました。 あなたは、永続的なテーブルにレコードを挿入するために「needする必要はありません。 ..same name .... temporary table ... same session "youがテーブル名を制御できるため!

(@SpeedyGonsalesによって参照される)混乱を避けるため、一時テーブルに接頭辞/接尾辞tmp _/_ tmpまたは同様のものが指定されていることを確認するだけです。

もし今この種の間違いを犯しているのなら、1年以内に誰かがシステムを初めて使う人にとってどれほど簡単になるか考えてみてください。あなたの組織(それがあなただけの場合でも!)には の命名規則 が必要です。そうでなければ、このような [〜#〜] snafu [〜# 〜]

0
Vérace