SQL - 插入后的TRIGGER

时间:2013-10-10 08:59:10

标签: sql triggers

我有两张桌子 - '客户'和' clients_address '

表'客户'列中包含名称为“电话”的列。 我需要在表' 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);

所有内容都被正确复制,但它不是自动更新。在新用户注册后,我需要再次执行此命令。我尝试使用触发器,但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中不是很好。请帮忙。

2 个答案:

答案 0 :(得分: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;

您使用的数据库是什么?

答案 1 :(得分: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。并且,请始终发布您在问题中收到的错误消息。