1

我有两个表 - ' clients ' 和 ' clients_address '

在表 ' clients ' 列上有名称为 ' phone '。我需要在表' clients_address '中有相同的列' phone '

我在表' clients_address '中创建列' phone '并使用这个命令从' 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不太好。请帮忙。

4

2 回答 2

2

尝试以下操作:

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;

你用的是什么数据库?

于 2013-10-10T09:09:16.813 回答
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其中缺少一个。并且请始终发布您与问题一起收到的错误消息。

于 2013-10-10T09:21:14.493 回答