場景:我希望能夠改變他們的用戶名的用戶(可惜我沒考慮增加這一功能,當我開始的部位),但MySQL數據庫擁有110個表。更改字段在許多MySQL表
我將不得不製作一個腳本,執行110個查詢來更新每個表中的用戶名(並且記得在添加新表時更新腳本),或者是否有鏈接所有字段的方法的表,所以更新一個表中的用戶名更新它在所有其他?
場景:我希望能夠改變他們的用戶名的用戶(可惜我沒考慮增加這一功能,當我開始的部位),但MySQL數據庫擁有110個表。更改字段在許多MySQL表
我將不得不製作一個腳本,執行110個查詢來更新每個表中的用戶名(並且記得在添加新表時更新腳本),或者是否有鏈接所有字段的方法的表,所以更新一個表中的用戶名更新它在所有其他?
您可以設置表做級聯更新。
這是通過使用外鍵來實現和ON UPDATE CASCADE
這裏是它的好文章:http://www.oreillynet.com/onlamp/blog/2004/10/hey_sql_fans_check_out_foreign.html
而且MySQL官方頁面: http://dev.mysql.com/doc/refman/5.1/en/ansi-diff-foreign-keys.html
不幸的是這是InnoDB的唯一,所以你必須切換表格。
您可以使用外鍵約束與ON UPDATE CASCADE自動更新外鍵被修改時(只InnoDB的)。
但是這將是最好不要使用用戶名作爲外鍵。您通常應該使用surrogate key作爲外鍵,這不是問題。
這隻適用於InnoDB表格,它還沒有在MyISAM中實現 – danielrsmith 2010-01-02 23:26:38
確實,謝謝指出。我將它添加到我的答案中。 – 2010-01-02 23:29:45
我假設你正在使用的用戶名作爲你的主鍵,因爲你已經看到了需要這樣做。將表結構更改爲使用auto_increment ID作爲主鍵而不是用戶名,並從其他表中引用ID,而不是直接引用該名稱。這樣可以防止表中的用戶名重複,並且可以通過更新單個表來更改用戶名。
請注意,您可能希望在用戶名本身上保留一個UNIQUE索引以防止出現重複:目前,您通過使用名稱作爲PK來獲得「免費」,並且您可以繼續讓數據庫管理它制定一個新的索引。
在回覆我的評論時,他說他每個用戶都有自動增量編號,我認爲這也是他的主要關鍵。 – 2010-01-02 23:30:55
更新多個表的關鍵是一個壞主意。您可能希望藉此機會重構數據庫,爲所有用戶添加一個自動增量整數主鍵,並將其用作您的外鍵而不是用戶名。這是一個很大的改變,但一旦完成,你不會後悔。你甚至可能會獲得更好的性能和更少的磁盤使用量。 – 2010-01-02 23:21:43
我有一個自動增量整數鍵爲每個用戶,用戶名,但所有其他表引用用戶名,否則這將是一個非問題,我不會問這個問題。 – 2010-01-02 23:23:43
好吧,看起來這是不可能的,我只需要做一堆查詢。考慮到網站是活的,我必須使用MyISAM並切換到使用userid而不是用戶名。 – 2010-01-02 23:30:04