Geçici bir tablo adlı oluşturmak için MySQL özyinelemeli bir saklı yordam kullanıyorum id_list
, ancak yordam içinde DROP
geçici tablo yapamam bu yüzden bir izleme seçme sorgusu bu yordamın sonuçlarını kullanmanız gerekir ...
BEGIN;
/* generates the temporary table of ID's */
CALL fetch_inheritance_groups('abc123',0);
/* uses the results of the stored procedure in the WHERE */
SELECT a.User_ID
FROM usr_relationships r
INNER JOIN usr_accts a ON a.User_ID = r.User_ID
WHERE r.Group_ID = 'abc123' OR r.Group_ID IN (SELECT * FROM id_list)
GROUP BY r.User_ID;
COMMIT;
Yordamı çağırırken, ilk değer istediğim dalın üst kimliği ve ikincisi tier
yordamlar sırasında yordamın kullandığı değerdir . Özyinelemeli döngüden önce çalışıp çalışmadığını kontrol eder tier = 0
:
DROP TEMPORARY TABLE IF EXISTS id_list;
CREATE TEMPORARY TABLE IF NOT EXISTS id_list (iid CHAR(32) NOT NULL) ENGINE=memory;
: Benim soru yani ben yoksa DROP
geçici MEMORY
prosedürün sonunda tablo, ya da benim işlem içinde, ne kadar bu tablo bellekte kalıcı olur? Oturum sona erdiğinde otomatik olarak kesilir mi yoksa bağlantı açık olduğu sürece bellekte kalır mı?
** NB Açık yanıt, taahhüt tablosundan önce geçici tabloyu bırakmak olabilir, ancak bir an için bunu yapamayacağımı varsayalım. *
EDIT : Biraz daha kesin olmak gerekirse, kalıcı bağlantılar kullanılırsa, tablo birden çok istek ile devam edecek mi? Şimdiye kadar öyle olacak ve bu kaynağı boşaltmak için geçici tabloyu açıkça kaldırmamız gerekecek gibi görünüyor.
GÜNCELLEME : Yorumculardan gelen tavsiyelere dayanarak, saklı yordamımı ayarlamanın bir yolunu buldum, böylece TEMP MEMORY tablosunu kullanabiliyorum, ancak DROP
sonunda açıkça yapabiliyorum ...
Sadece saklı yordamı çağırmak ve gerçek sorgu sonuçları toplamak için kalan TEMP tablo CALL
kullanmak yerine, OUT
böyle üçüncü bir değişken kullanmak için biçim değiştirdim :
CALL fetch_inheritance_groups('abc123','0',@IDS);
... sonra saklı yordam içinde, IF tier = 0
sonuna bir saniye ekledi :
IF tier = 0
THEN
SELECT GROUP_CONCAT(DISTINCT iid SEPARATOR ',') FROM id_list INTO inherited_set;
DROP TEMPORARY TABLE IF EXISTS id_list;
END IF;
Bu nedenle, saklı yordamın sonucu artık uyumlu bir virgülle ayrılmış kimlik listesi FIND_IN_SET
ve böylece son sorgu değiştirildi ki:
WHERE r.Group_ID = 'abc123' OR r.Group_ID IN (SELECT * FROM id_list)
... şimdi ...
WHERE r.Group_ID = 'abc123' OR FIND_IN_SET(r.Group_ID,@IDS)
İşte bu kadar! Yorumcunuz için yorumculara ve bana biraz daha denemem için nedenini verdiğiniz için teşekkürler :)
DROP
geçici BELLEK için bize GEREKLİDİR tablo. Doğru kabul eder miyim?