我是这里的新手,也是PostgreSQL的新手。我在两个不同的表中有两个不同的布尔列。当我在true
中将我的布尔列更新为tableone
时,我还必须在tabletwo
中将布尔列设置为true
。
例如:(这些与sipariskod
相关)
UPDATE tabletwo
SET kalemonay = tableone.sonaydurum
FROM tableone
WHERE tabletwo.sipariskod='10'
我使用了这个SQL查询,但它没有用。我不知道为什么。 :(
当我更新tableone
的布尔值以更新tabletwo
中的布尔值时,我需要一个函数或触发器来执行 - 如果它存在同一个sipariskod
。
我会感激任何帮助。
答案 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 constraint和ON UPDATE CASCADE
,整个可能更干净。取决于细节。
您必须清除引用表中的违规值,并在创建外键之前在引用的列上创建唯一(或主要)索引。您是否知道可以在多列上构建外键?