2010-09-13 41 views
2

對於以下(簡化)mysql數據庫設置,我想將適用的GUID複製到message表中。這可以通過一個SQL update完成嗎?Mysql:是否有一個更新語句會按以下方式反規範化?

alt text

CREATE TABLE IF NOT EXISTS `user` (
    `id` int(11) NOT NULL AUTO_INCREMENT, 
    `guid` varchar(13) NOT NULL, 
    PRIMARY KEY (`id`) 
) ENGINE=InnoDB; 

INSERT INTO `user` (`id`, `guid`) VALUES 
(1, 'a'), 
(2, 'b'), 
(3, 'c'); 


CREATE TABLE IF NOT EXISTS `message` (
    `user` int(11) NOT NULL, 
    `user_guid` varchar(13) NOT NULL, 
    KEY `user` (`user`) 
) ENGINE=InnoDB; 
ALTER TABLE `message` 
    ADD CONSTRAINT `message_ibfk_1` FOREIGN KEY (`user`) REFERENCES `user` (`id`) ON DELETE CASCADE; 

INSERT INTO `message` (`user`, `user_guid`) VALUES 
(3, ''), 
(2, ''), 
(3, ''); 

回答

2

用途:

UPDATE MESSAGE 
    SET user_guid = (SELECT u.guid 
         FROM USER u 
        WHERE u.id = MESSAGE.user) 
WHERE EXISTS(SELECT NULL 
       FROM USER u 
       WHERE u.id = MESSAGE.user) 
+0

如果表格的大小很大,那麼這會很快旋轉。 – 2010-09-13 18:30:02

+0

這個效果很好,我用'UPDATE消息SET user_guid =(SELECT u.guid FROM user u WHERE u.id = message.user);'。 – 2010-09-13 18:35:34

+0

@ gms8994:您認爲JOIN更改了需要更新大量數據的事實嗎?所有數據庫都不支持UPDATE(或DELETE)JOIN;這與JonH的JOIN查詢相當。 – 2010-09-13 18:37:05

7

UPDATE M集m.user_guid = u.guid FROM消息m INNER JOIN用戶u ON u.id = m.user

上面是對MS SQL 。

對於MySQL試試這個:

UPDATE FROM message as m INNER JOIN user as u ON u.id = m.user 
SET m.user_guid = u.guid 

還是後者後者:

UPDATE message as m SET m.user_guid = u.guid 
FROM message INNER JOIN user as u ON u.id = m.user 
+0

JonH,謝謝您的回答。雖然,我無法在MySQL 5.1.47社區中使用它。 MySQL是否支持這種UPDATE-FROM語法? – 2010-09-13 18:13:47

+0

@Derek Illchuk - 嘗試我發佈的第二個更新。我認爲前者適用於MS SQL,後者適用於mySQL。 – JonH 2010-09-13 18:20:40

+0

JonH,無論哪種情況,我的MySQL服務器都不喜歡'FROM ...'。我認爲不支持MySQL上的UPDATE-FROM。再一次,謝謝你,這是一個投票。 – 2010-09-13 18:40:28