我有两张桌子 - '客户'和' 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中不是很好。请帮忙。
答案 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
。并且,请始终发布您在问题中收到的错误消息。