0

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

例如:(这些与 相关sipariskod

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

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

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

我会很感激任何帮助。

4

1 回答 1

1

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

在任何情况下,您的查询都会失败。没有连接两个表的条​​件,因此它会产生一个昂贵且无意义的笛卡尔积- 与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

于 2013-04-12T15:18:36.470 回答