在另一张桌子上的桌子上级联更新

时间:2013-04-12 14:46:08

标签: sql postgresql triggers sql-update

我是这里的新手,也是PostgreSQL的新手。我在两个不同的表中有两个不同的布尔列。当我在true中将我的布尔列更新为tableone时,我还必须在tabletwo中将布尔列设置为true

例如:(这些与sipariskod相关)

UPDATE tabletwo 
SET kalemonay = tableone.sonaydurum 
FROM  tableone 
WHERE tabletwo.sipariskod='10'

我使用了这个SQL查询,但它没有用。我不知道为什么。 :(

当我更新tableone的布尔值以更新tabletwo中的布尔值时,我需要一个函数或触发器来执行 - 如果它存在同一个sipariskod

我会感激任何帮助。

1 个答案:

答案 0 :(得分:1)

无法从您提供的有限信息中猜出最佳解决方案。

在任何情况下,您的查询都会失败。连接两个表没有条件,因此导致昂贵且无意义的Cartesian product - 与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;

我添加了一些检查以避免空更新。

外键

但使用foreign key constraintON UPDATE CASCADE,整个可能更干净。取决于细节。 您必须清除引用表中的违规值,并在创建外键之前在引用的列上创建唯一(或主要)索引。您是否知道可以在多列上构建外键?