MySQL'de tabloları nasıl değiştiririm?


51

Diyelim ki fooher zaman ve sonra hesaplanan bazı istatistikleri içeren bir tablom var. Diğer sorgular tarafından yoğun olarak kullanılır.

Bu yüzden daha yeni istatistikleri hesaplamak foo_newve hesaplama hazır olduğunda bunları değiştirmek istiyorum .

Yapabilirim

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

peki eğer bir sorgu tablo fooyokken bu iki satır arasında bir tabloya ihtiyaç duyarsa ne olur foo? Sanırım bir şekilde kilitlemeliyim ... yoksa yapmanın başka bir yolu var mı?

Yanıtlar:


79

Bu tek komutu kullanın:

RENAME TABLE foo TO foo_old, foo_new To foo;

Bu bir atomik işlemdir: her iki tablo birbirine kilitlenir (ve çok kısa bir süre için), bu nedenle herhangi bir erişim ya önce ya da sonrasında gerçekleşir RENAME.



2
Bununla ilgili bir sorun, eğer varsa tableXbende ebeveyn kısıtlama referansı var foo. Bu RENAME'den sonra şimdi referans veriyor olacak, foo_oldancak atıfta bulunacak herhangi bir kısıtlama yoksa, iyi fooolmanız gerekir ...
Marcin Wasiluk

@MarcinWasiluk - bir başka dezavantaj FOREIGN KEYs.
Rick James,

2
Ayrıca, RENAME TABLE'ın, masadaki mevcut sorguların yürütülmesini beklemek için bitmesini beklemek zorunda olduğunu bilmeye değer. Bu iyi olurdu, ancak RENAME'in gerçekleşmesini beklerken diğer sorguları da kapatıyor! Bu, veritabanı tablolarınızın ciddi şekilde kilitlenmesine neden olabilir (bizim için vardır). Bu innodb için geçerlidir!
John Hunt,
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.