Как поменять местами таблицу MySQL и изменить auto_increment? - PullRequest
0 голосов
/ 08 мая 2009

У меня есть две таблицы:

CREATE TABLE table_a (
    id SERIAL
);
CREATE TABLE table_b (
    id SERIAL
);

Я хочу поменять таблицы и установить для auto_increment новой table_a значение MAX (id) +1 для table_b. Э.Г.

SELECT @A:=MAX(id) FROM table_a;
SET @qry = CONCAT('ALTER TABLE table_b AUTO_INCREMENT =', @A+1);
PREPARE stmt FROM @qry;
EXECUTE stmt;
RENAME TABLE table_a TO table_b_tmp, table_b TO table_a, table_b_tmp TO table_a;

К сожалению, я не могу ни заблокировать таблицы, ни сделать это в транзакции, поскольку RENAME TABLE не работает с заблокированной таблицей и ALTER TABLE неявно фиксирует.

Единственное решение, которое я могу придумать, чтобы избежать наложения идентификаторов, это установить auto_increment + 50, но так как этот процесс происходит часто, я бы предпочел, чтобы в моих идентификаторах не было множества дыр.

Есть идеи?

1 Ответ

0 голосов
/ 08 мая 2009

Пока сервер не имеет версию MS Windows и вы придерживаетесь нетранзакционных таблиц, вы сможете использовать блокировки таблиц и ALTER TABLE table_name RENAME TO new_table_name заявления.

LOCK TABLES table_a WRITE, table_b WRITE;
SELECT @A:=MAX(id)+1 FROM table_a;
ALTER TABLE table_a RENAME TO table_a_tmp;
LOCK TABLES table_b WRITE, table_a_tmp WRITE;
PREPARE stmt FROM 'ALTER TABLE table_b RENAME TO table_a, AUTO_INCREMENT = ?';
EXECUTE stmt USING @A;
ALTER TABLE table_a_tmp RENAME TO table_b;
UNLOCK TABLES;

Второй замок беспокоит меня. Если есть какие-либо другие ожидающие сессии, получат ли они шанс за столами до блокировки? Я также мог легко ошибаться по поводу вышеупомянутой работы. Я основываю вышеизложенное на страницах ниже о блокировках, транзакциях и операторах ALTER.

Другая мысль: вы можете создать таблицу MERGE для вставок, обновив метод слияния на FIRST или LAST вместо (вместе с?) Замены таблиц. Будет ли это работать?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...