Dua tabel dengan nama yang sama di MySQL


8

Saya mendapat masalah aneh ini hari ini ketika saya menjatuhkan meja sementara. Saya menjatuhkan tabel sementara dan menghapus tabel hanya untuk memverifikasi. Tapi, meja itu tidak terjatuh. Setelah beberapa pencarian saya menemukan bahwa:

MySQL memungkinkan untuk membuat tabel sementara dengan nama yang sama dengan tabel permanen. Jadi meja sementara dijatuhkan dan bukan meja permanen. Saya benar-benar bingung dengan meja yang saya gunakan.

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

Inilah yang saya uji:

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

Apakah ini bug atau ada cara alternatif untuk mengatasi ini?

Jawaban:


6

MySQL memungkinkan Anda untuk membuat tabel temp dengan nama yang sudah ada karena mereka tidak memiliki "cakupan" yang sama. Tabel sementara hanya terlihat di sesi, dan dijatuhkan di akhir sesi. Jika Anda memiliki nama yang sama, MySQL "menyembunyikan" tabel asli hingga Anda menjatuhkan tabel temp.

Anda dapat merujuk ke bagian Tabel Sementara di dokumentasi MySQL

Maks.


1
bagaimana jika saya perlu memasukkan beberapa catatan di tabel permanen ketika saya memiliki tabel sementara dengan nama yang sama dengan tabel permanen di sesi yang sama.
BALA

Anda tidak bisa. Anda harus mengawali meja Anda atau menemukan nama yang berbeda.
Maxime Fouilleul

1
@BALA, Sejak tabel sementara tidak perlu ada dalam database "nyata", Anda cukup menempatkan mereka dalam "palsu" basis data, misalnya: create temporary table fake_db.t as select*from t.
Pacerier

1

Dari manual ( CREATE TABLE ):

Tabel TEMPORARY hanya terlihat oleh sesi saat ini, dan dijatuhkan secara otomatis ketika sesi ditutup. Ini berarti bahwa dua sesi yang berbeda dapat menggunakan nama tabel sementara yang sama tanpa saling bertentangan atau dengan tabel non-TEMPORARY yang ada dengan nama yang sama. (Tabel yang ada disembunyikan sampai tabel sementara dijatuhkan.)

Itu berarti setelah Anda membuat tabel sementara dengan nama yang sama dengan beberapa tabel yang ada, Anda tidak bisa mengakses tabel normal dengan nama itu, tetapi hanya yang sementara (selama sesi itu). Jika Anda berpikir bahwa membuka ruang untuk kesalahan, gunakan nama lain untuk tabel sementara (mis. Gunakan awalan temp_) - itu sederhana dan tidak menyisakan ruang untuk kebingungan.


0

Anda telah menjawab pertanyaan ini dalam pertanyaan pertama Anda. Anda tidak " perlu menyisipkan catatan dalam tabel permanen ... nama yang sama .... tabel sementara ... sesi yang sama" karena Anda memiliki kendali atas nama tabel!

Anda cukup memastikan bahwa tabel sementara diberikan awalan / akhiran tmp _ / _ tmp atau serupa karena ini menghindari kebingungan (sebagaimana dimaksud oleh @SpeedyGonsales).

Jika Anda membuat kesalahan semacam ini sekarang, pikirkan betapa mudahnya membuat seseorang yang baru dalam sistem dalam waktu satu tahun! Organisasi Anda (bahkan jika itu hanya Anda!) Harus memiliki konvensi penamaan , jika tidak Anda akan mendapatkan SNAFU semacam ini .

Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.