Як замінити таблиці в MySQL?


51

Припустимо, у мене є таблиця foo, яка містить деякі статистичні дані, які розраховуються раз у раз. Він широко використовується в інших запитах.

Ось чому я хочу обчислити новіші статистичні дані foo_newі поміняти їх, коли обчислення готові.

Я міг би зробити

ALTER TABLE foo RENAME foo_tmp;
ALTER TABLE foo_new RENAME foo;

але що станеться, якщо запиту потрібна таблиця fooміж цими двома рядками, коли таблиці немає foo? Я думаю, що я мушу якось це заблокувати ... чи є інший спосіб це зробити?

Відповіді:


79

Скористайтеся цією командою:

RENAME TABLE foo TO foo_old, foo_new To foo;

Це атомна операція: обидві таблиці фіксуються разом (і на дуже короткий час), тому будь-який доступ відбувається перед або після RENAME.



2
Одна з проблем полягає в тому, що якщо я маю, tableXце має посилання на батьківські обмеження foo. Після цього RENAME тепер буде посилатися, foo_oldале якщо немає жодних обмежень, посилаючись на них, fooвам слід бути в порядку ...
Marcin Wasiluk

@MarcinWasiluk - ще один недолік FOREIGN KEYs.
Рік Джеймс

2
Також варто пам’ятати, що RENAME TABLE доводиться чекати, коли існуючі запити в таблиці завершаться, поки вони не можуть бути виконані. Це було б добре, але він також блокує інші запити, очікуючи на те, що RENAME відбудеться! Це може спричинити серйозну блокування таблиць вашої бази даних (вона є для нас). Це стосується innodb!
Джон Хант
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.