2011-11-02 70 views
1

我有一個包含大約3,000,000行的巨大城市表。我需要創建一個包含以下行的新列:什麼是以下最乾淨的方式(MySQL)

'City name, City name with accent, Country name' 

基本架構如下:

city_id   int 
name   varchar 
status   varchar 
date_created int(11) 
country_id  int 
accent_name  varchar 
city_country text 

而且還有其中包含contry_id,它的名字國表。

現在我想出了2種方法來填充city_country列。

嘗試1:

delimiter // 
CREATE FUNCTION getConcat(x INT(11)) 
    RETURNS TEXT 
    READS SQL DATA 
BEGIN 
    DECLARE var1 TEXT; 
    SELECT concat(CT.name, ', ', CT.accent_name, ', ', CR.name) AS Combined INTO var1 FROM `wp_City` AS CT LEFT JOIN `wp_Country` AS CR ON CR.country_id = CT.country_id WHERE CT.city_id = x; 
    RETURN var1; 
END// 
UPDATE `wp_City` SET `city_country`=(SELECT getConcat(city_id)) WHERE 1; 

嘗試2:

我創建僅包含一列的新表:

INSERT INTO `_myCity` (name, status, date_created, country_id, accent_name, lat, `long`, region, city_country) 
    SELECT c.name, c.status, c.date_created, c.country_id, c.accent_name, c.lat, c.long, c.region, _c.name 
    FROM `wp_City` as c inner join `wp_Country` _c on c.country_id = _c.country_id 

現在第二方式是快得多,但是更清潔?以上只會執行一次,所以問題只是出於好奇。如果有更好的方法來實現這一點,請分享!

預先感謝您。

+0

任何理由你反常規這樣的數據? –

回答

2

如果我做這樣的事情,我寧願用在需要時添加列的視圖去(這樣就避免了在磁盤上的表中存儲的冗餘數據帶來的額外開銷)

相關問題