2011-06-17 56 views
1

如果我有兩個具有相同user_id KEY的表'用戶'和'訂單',並且我想知道是否在一個表中更新user_id,我如何獲取它以更新在其他表中自動?自動更新關係表中的鍵

CREATE TABLE users(
id SMALLINT AUTO_INCREMENT, 
user_id VARCHAR(15), 
PRIMARY KEY(id), 
KEY(user_id) 
) ENGINE=MyISAM; 

CREATE TABLE orders(
user_id VARCHAR(15), 
//otherStuff, 
KEY(user_id) 
) ENGINE=MyISAM; 
+0

user_id被改變了怎麼可能? – zerkms 2011-06-17 04:04:43

+0

例如,如果用戶決定更新他們的名字。 – locoboy 2011-06-17 04:07:16

+0

創建另一個字段'name',並且在表中'orders'參考'users.id'字段 – zerkms 2011-06-17 04:08:31

回答

5

首先,我推薦使用InnoDB引擎,而不是MyIsam。 InnoDB支持外鍵,在create table stament中包含「ENGINE = InnoDB;」

外鍵會強制實施表間的參照完整性,即如果您嘗試使用INSERT訂單且不存在用戶標識,則系統將引發錯誤。

外鍵可以在變化,當然,變革ID在參考表中的參考情況可以是:

CREATE TABLE orders(
    user_id VARCHAR(15), 
    //otherStuff, 
    KEY(user_id), 
    FOREIGN KEY (user_id) REFERENCES users(user_id) 
    ON UPDATE CASCADE 
) ENGINE=InnoDB; 

這ON UPDATE CASCADE,在變化的情況下改變USER_ID的值。

+0

Thx for traslate @onedaywhen,我正在學習englesh:P – Exos 2011-06-18 05:28:44

2

MyISAM引擎不支持外鍵,所以我想你將不得不使用觸發器:

DELIMITER $$ 
CREATE TRIGGER abc AFTER update ON orders FOR EACH ROW BEGIN 
    UPDATE users SET user_id = NEW.user_id WHERE user_id = OLD.user_id; 
END$$ 
DELIMITER ; 

您還需要更新後觸發上users表第二觸發器。

+0

如果我使用innodb,該怎麼辦? – locoboy 2011-06-17 04:08:45

+0

@ cfarm54:不要這樣做,這是一個錯誤的做法。 – zerkms 2011-06-17 04:11:31

+1

然後,您可以使用帶有'ON UPDATE CASCADE'子句的外鍵。 – Crozin 2011-06-17 04:11:52