2013-10-10 42 views
0

之後,我有兩個表 - '客戶' 和 'clients_address'SQL - 觸發器插入件

有上表 '客戶' 名爲 '電話' 列。 我需要有相同的列「電話」表「clients_address

我創建列「電話」表「clients_address」和白衣這個命令我從「複製的數據clients.phone「:

UPDATE clients_addresses 
SET clients_addresses.phone=(SELECT clients.phone 
FROM clients 
WHERE clients.id=clients_addresses.client_id); 

一切都是正確複製,但它不是autou PDATE。在新用戶註冊後,我需要再次執行此命令。我試着用觸發器,但SQL返回我sintax錯誤。這是我嘗試:

CREATE TRIGGER up 
ON clients.phone 
AFTER INSERT 
BEGIN 
UPDATE clients_addresses 
SET clients_addresses.phone=(SELECT clients.phone 
FROM clients 
WHERE clients.id=clients_addresses.client_id) 
END; 

我不是在SQL非常好。請幫忙。

+1

通過提供您看到的錯誤來幫助我們。 – pordi

回答

1

嘗試以下操作:

CREATE TRIGGER up 
AFTER INSERT 
    ON clients 
    FOR EACH ROW 
BEGIN 
    UPDATE clients_addresses 
    SET clients_addresses.phone = :new.phone 
    WHERE clients_addresses.client_id = :new.id; 
END; 

什麼數據庫您使用的?

0

你缺少的是你的更新聲明後的;。不過,這會結束觸發器定義。若要指示;完成更新語句而不是觸發器定義,則必須先更改分隔符。

DELIMITER $$ 
CREATE TRIGGER up 
ON clients.phone 
AFTER INSERT 
BEGIN 
UPDATE clients_addresses 
SET clients_addresses.phone=(SELECT clients.phone 
FROM clients 
WHERE clients.id=clients_addresses.client_id); 
END $$ 
DELIMITER ; 

之後,我們將分隔符更改回標準;。除此之外,我建議使用聯接而不是子查詢。此外,您只需更新剛插入的客戶端的電話,而不是整個表格。你錯過了你的WHERE子句。

DELIMITER $$ 
CREATE TRIGGER up 
ON clients.phone 
AFTER INSERT 
BEGIN 
UPDATE clients_addresses ca 
INNER JOIN clients c ON c.id = ca.client_id 
SET ca.phone = c.phone 
WHERE c.id = NEW.id; 
END $$ 
DELIMITER ; 

你沒有提到你正在使用的RDBMS。可能與正確的陳述有所不同。例如,如果您使用的是MySQL,那麼您在那裏缺少FOR EACH ROW。而且,請始終發佈您遇到的問題的錯誤消息。