从您提供的有限信息中无法猜出最佳解决方案。
在任何情况下,您的查询都会失败。没有连接两个表的条件,因此它会产生一个昂贵且无意义的笛卡尔积- 与CROSS JOIN
. 实际上,您可以为 中的每一行获取一个更新,而不是仅进行一次更新,tableone
并且没有定义其中哪一个最晚才能产生持久的影响。
由于您提供:
(这些与 sipariskod 有关)
..您的查询可能如下所示:
UPDATE tabletwo t2
SET kalemonay = t1.sonaydurum
FROM tableone t1
WHERE t2.sipariskod = t1.sipariskod
AND t1.??? = ???
但是在您可以使用该对象的触发器函数中,此语句看起来会有所不同。NEW
例如,在触发器的触发器函数内部
CREATE TRIGGER foo
AFTER UPDATE ON TABLE ON tableone
FOR EACH ROW EXECUTE PROCEDURE foo();
触发函数可能如下所示:
CREATE OR REPLACE FUNCTION foo()
RETURNS trigger AS
$func$
BEGIN
IF NEW.sonaydurum IS DISTINCT FROM OLD.sonaydurum THEN
UPDATE tabletwo t2
SET kalemonay = NEW.sonaydurum
WHERE t2.sipariskod = NEW.sipariskod;
AND kalemonay IS DISTINCT FROM NEW.sonaydurum;
END IF;
RETURN NULL;
END
$func$ LANGUAGE plpgsql;
我添加了一些检查以避免空更新。
外键
但是使用外键约束和. 取决于细节。在创建外键之前,您必须清除引用表中的违规值,并在引用的列上创建唯一(或主)索引。您知道外键可以建立在多列上吗?ON UPDATE CASCADE