Две таблицы с одинаковыми именами в MySQL


8

Я получил эту странную проблему сегодня, когда уронил временный стол. Я удалил временную таблицу и удалил ее, чтобы проверить. Но стол не упал. После некоторых поисков я обнаружил, что:

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

Это ошибка или есть альтернативный способ преодолеть это?

Ответы:


6

MySQL позволяет вам создавать временную таблицу с существующим именем, потому что они не имеют одинаковую «область видимости». Временная таблица видна только в сеансе и удаляется по окончании сеанса. Если у вас одно и то же имя, MySQL «скрывает» исходную таблицу, пока вы не удалите временную таблицу.

Вы можете обратиться к разделу Временные таблицы в документации MySQL.

Максимум.


1
Что делать, если мне нужно вставить некоторые записи в постоянную таблицу, когда у меня есть временная таблица с тем же именем, что и постоянная таблица в том же сеансе.
Бала

Вы просто не можете. Вы должны префикс вашей таблицы или найти другое имя.
Максим Фуйе

1
@BALA, Так как временные таблицы не должны существовать в «реальных» базах данных, вы можете просто поместить их в базе данных «поддельной», например: create temporary table fake_db.t as select*from t.
Pacerier

1

Из руководства ( CREATE TABLE ):

Таблица TEMPORARY видна только текущему сеансу и автоматически удаляется при закрытии сеанса. Это означает, что два разных сеанса могут использовать одно и то же временное имя таблицы, не конфликтуя друг с другом или с существующей, не являющейся TEMPORARY, таблицей с одним и тем же именем. (Существующая таблица скрыта, пока временная таблица не будет удалена.)

Это означает, что после создания временной таблицы с тем же именем, что и у некоторой существующей таблицы, вы не можете получить доступ к обычной таблице с таким именем, но только к временной (во время этого сеанса). Если вы думаете, что это открывает место для ошибки, используйте другое имя для временной таблицы (например, используйте префикс temp_) - это просто и не оставляет места для путаницы.


0

Вы ответили на этот вопрос в своем первом. Вам не нужно " вставлять записи в постоянную таблицу ... с тем же именем .... во временную таблицу ... с тем же сеансом", потому что вы можете контролировать имена таблиц!

Вы просто гарантируете, что временная таблица получает префикс / суффикс tmp _ / _ tmp или аналогичный, так как это позволяет избежать путаницы (на что ссылается @SpeedyGonsales).

Если вы делаете такую ​​ошибку сейчас, просто подумайте, как легко будет сделать для кого-то новичка в системе через год! Ваша организация (даже если это только вы!) Должна иметь соглашение об именах , в противном случае вы получите SNAFU такого рода .

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.