Модераторы: skyboy
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Переименование таблицы и создание новой 
:(
    Опции темы
maxipub
Дата 8.12.2014, 12:14 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 517
Регистрация: 22.10.2009

Репутация: 1
Всего: 1



Добрый день!

Ребята, можно как-то переименовать таблицу TABLE_1 в TABLE_2 и при этом создать таблицу TABLE_1 со структурой и AI из TABLE_2 ?

Пока писал топик, пришел вот к чему:

Код
RENAME TABLE table_1 TO table_2;
CREATE TABLE table_1 LIKE table_2;


1. Насколько корректное решение?

2. Проблема в том, что CTL не сохраняет AI (в создаваемой TABLE_1), читал мануал, не нашел как его сохранять.

3. Можно как-то объединить эти запросы, чтобы таблица TABLE_1 блокировалась на все время выполнения? Чтобы туда не вклинился никакой INSERT INTO TABLE_1...?

Спасибо! smile 
PM MAIL   Вверх
Akina
Дата 8.12.2014, 15:05 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Советчик
****


Профиль
Группа: Модератор
Сообщений: 20581
Регистрация: 8.4.2004
Где: Зеленоград

Репутация: 106
Всего: 454



Что имеется в виду под AI? При чём тут CTL?

Цитата(maxipub @  8.12.2014,  13:14 Найти цитируемый пост)
Насколько корректное решение?

Корректное при отсутствии триггеров на исходную таблицу и FK на неё. Иначе нет.

А какова вообще цель этого шаманства?


--------------------
 О(б)суждение моих действий - в соответствующей теме, пожалуйста. Или в РМ. И высшая инстанция - Администрация форума.

PM MAIL WWW ICQ Jabber   Вверх
maxipub
Дата 8.12.2014, 15:51 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 517
Регистрация: 22.10.2009

Репутация: 1
Всего: 1



Цитата(Akina @  8.12.2014,  15:05 Найти цитируемый пост)
Что имеется в виду под AI?

AUTO_INCREMENT

Цитата(Akina @  8.12.2014,  15:05 Найти цитируемый пост)
 При чём тут CTL?

Ну он ведь копирует структуру, думаю, логично будет если и AI может копировать.

Цитата(Akina @  8.12.2014,  15:05 Найти цитируемый пост)
Корректное при отсутствии триггеров на исходную таблицу и FK на неё.

Их нет.

Цитата(Akina @  8.12.2014,  15:05 Найти цитируемый пост)
А какова вообще цель этого шаманства? 

Сбрасывать логи за месяц по отдельным таблицам для последующей выгрузки их с сервера. Логи нужны именно в таблице, а не в файле, ибо по ним требуется проводить выборки по различным условиям, сортировкам, группировкам и т.д. Можно, конечно, просто создавать новую таблицу с именем типа 'logs_%F_%H', но вариант с постоянным именем таблицы текущих логов мне кажется более правильным.
PM MAIL   Вверх
Akina
Дата 8.12.2014, 17:47 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Советчик
****


Профиль
Группа: Модератор
Сообщений: 20581
Регистрация: 8.4.2004
Где: Зеленоград

Репутация: 106
Всего: 454



Цитата(maxipub @  8.12.2014,  16:51 Найти цитируемый пост)
вариант с постоянным именем таблицы текущих логов мне кажется более правильным.

Тогда внимательнейшим образом изучай MERGE Storage Engine.
И столь же внимательно - Range Partitioning.
И то, и другое подходит для твоей задачи намного лучше. И гораздо менее геморройно.


--------------------
 О(б)суждение моих действий - в соответствующей теме, пожалуйста. Или в РМ. И высшая инстанция - Администрация форума.

PM MAIL WWW ICQ Jabber   Вверх
_zorn_
Дата 9.12.2014, 07:46 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1076
Регистрация: 21.8.2007

Репутация: 2
Всего: 12



Цитата
Note that column a is indexed as a PRIMARY KEY in the underlying MyISAM tables, but not in the MERGE table. There it is indexed but not as a PRIMARY KEY because a MERGE table cannot enforce uniqueness over the set of underlying tables.

И автоинкремент идет лесом. Ну и ограничение на использование только MyISAM.

С партициями по моему геморройнее чем просто создавать таблицу типа так
Код

CREATE TABLE `logs_201411` LIKE `logs`;
INSERT INTO `logs_201411` SELECT * FROM `logs` WHERE `date`>='2014-11-01' AND `date`<'2014-12-01';
DELETE FROM `logs` WHERE `date`>='2014-11-01' AND `date`<'2014-12-01';


PM MAIL   Вверх
maxipub
Дата 9.12.2014, 10:08 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 517
Регистрация: 22.10.2009

Репутация: 1
Всего: 1



Akina, спасибо за совет. Не уверен, конечно, что из-за такой мелочи стоит суетиться. Но для общего развития почитаем. smile

Цитата(_zorn_ @  9.12.2014,  07:46 Найти цитируемый пост)
просто создавать таблицу типа так

smile  smile это же долго!
PM MAIL   Вверх
maxipub
Дата 9.12.2014, 10:31 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 517
Регистрация: 22.10.2009

Репутация: 1
Всего: 1



Пробую так:

Код
RENAME TABLE table_8 TO table_9;
CREATE TABLE table_8 LIKE table_9;
ALTER TABLE table_8 AUTO_INCREMENT = (SELECT auto_increment FROM information_schema.tables WHERE table_name='table_9');


Получаю:

Код
#1064 - You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near '(SELECT auto_increment FROM information_schema.tables WHERE table_name='table_9'' at line 1


 smile что не так!?
PM MAIL   Вверх
Akina
Дата 9.12.2014, 10:34 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Советчик
****


Профиль
Группа: Модератор
Сообщений: 20581
Регистрация: 8.4.2004
Где: Зеленоград

Репутация: 106
Всего: 454



Цитата(_zorn_ @  9.12.2014,  08:46 Найти цитируемый пост)
автоинкремент идет лесом. Ну и ограничение на использование только MyISAM.

MERGE
Речь идёт о сервере логов. Так что MyISAM - самый подходящий движок. Что же до автоинкремента, то никто не мешает установить начальное значение перед созданием очередной таблицы, причём с запасом, чтобы гарантировать неперекрытие - это же, если не будет вставок с явным заданием значения, гарантирует от коллизий. И в данном случае собственно MERGE используется не для того, чтобы что-то объединять, а для того, чтобы частную таблицу представить как таблицу с жёстко заданным именем. Т.е. фактически алиас уровня серверной логики:

Код

-- far ago
CREATE TABLE log (ID BIGINT, ...) ENGINE = MERGE UNION = (...) INSERT_METHOD=LAST;
-- before 01/05/2014 00:00
CREATE TABLE log_2014_05 (ID BIGINT AI PK, ...) AUTO_INCREMENT = 2014050000000000001;
-- at 01/05/2014 00:00
ALTER TABLE log UNION=(log_2014_05);
-- before 01/06/2014 00:00
CREATE TABLE log_2014_06 (ID BIGINT AI PK, ...) AUTO_INCREMENT = 2014060000000000001;
-- at 01/06/2014 00:00
ALTER TABLE log UNION=(log_2014_06);


PARTITION
Ограничения на движок и проблем с автоинкрементом - нет. Фактически это просто деление на единицы хранения (мультифайловое хранение), причём в автоматическом режиме. Единственное - надо заранее создать эти единицы хранения. Но - один раз на сто лет вперёд создай и забудь навсегда.

Добавлено через 3 минуты и 2 секунды
Цитата(maxipub @  9.12.2014,  11:31 Найти цитируемый пост)
что не так!? 

Значение автоинкремента задаётся только литералом. Если прёт именно так - можно попробовать PREPARE STATEMENT.


--------------------
 О(б)суждение моих действий - в соответствующей теме, пожалуйста. Или в РМ. И высшая инстанция - Администрация форума.

PM MAIL WWW ICQ Jabber   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | MySQL | Следующая тема »


 




[ Время генерации скрипта: 0.0556 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.