gpt4 book ai didi

database - PostgreSQL 只插入数据库中的空列

转载 作者:行者123 更新时间:2023-11-29 13:56:02 28 4
gpt4 key购买 nike

我很难理解什么是 NEWOLD 。这是一个 MWE,显示了我正在努力实现的目标。我想要实现的是防止在已经存在的情况下将某些内容添加到其他内容中。把它想象成一个 parking 位。如果那里已经有一辆新车就不能进去。现在我只检查第一个 parking 位。最后我想检查所有这三个。

DROP TABLE IF EXISTS Parking CASCADE;

CREATE TABLE IF NOT EXISTS Car (
id SERIAL PRIMARY KEY
);

CREATE TABLE IF NOT EXISTS Parking (
id SERIAL PRIMARY KEY,
spot1 INT REFERENCES Car (id),
spot2 INT REFERENCES Car (id),
spot3 INT REFERENCES Car (id)
);

CREATE OR REPLACE FUNCTION f_check_spot_free() RETURNS TRIGGER AS $check_spot_free$
BEGIN
IF OLD.spot1 IS NOT NULL AND NEW.spot1 IS NOT NULL THEN
RAISE EXCEPTION 'spot 1 already occupied by car %. Cant change to car %', OLD.spot1, NEW.spot1;
END IF;
RETURN NEW;
END;

$check_spot_free$ LANGUAGE plpgsql;

CREATE TRIGGER check_spot_free
BEFORE UPDATE ON Parking
FOR EACH ROW
Execute procedure f_check_spot_free ();

INSERT INTO Car (id) VALUES (DEFAULT);
INSERT INTO Car (id) VALUES (DEFAULT);
INSERT INTO Car (id) VALUES (DEFAULT);
INSERT INTO Car (id) VALUES (DEFAULT);

INSERT INTO Parking (spot1,spot2,spot3) VALUES (NULL,NULL,4);

UPDATE Parking SET spot1=1 WHERE id=1; -- Put car 1 in spot 1
UPDATE Parking SET spot2=2 WHERE id=2; -- Put car 2 in spot 2
UPDATE Parking SET spot3=3 WHERE id=3; -- Fail while trying to put car 3 in spot 3

这是我得到的输出

DROP TABLE
CREATE TABLE
CREATE TABLE
CREATE FUNCTION
CREATE TRIGGER
INSERT 0 1
INSERT 0 1
INSERT 0 1
INSERT 0 1
INSERT 0 1
UPDATE 1
UPDATE 0
UPDATE 0

我不明白为什么第二个和第三个更新语句不起作用。我怀疑它与 NEWOLD 有关,我只是不明白我在做什么。更糟糕的是,我没有看到异常。

最佳答案

由于缺乏对OLDNEW 的理解,我的逻辑存在缺陷。事实证明,NEW 返回整个新行,甚至是未更新的列。如果有人知道如何隔离已更改的列,那将是一个很大的帮助。同时,这是我通过添加以下内容解决问题的方法

IF OLD.spot1 IS NOT NULL AND NEW.spot1 IS NOT NULL AND OLD.spot1 != NEW.spot1 THEN

关于database - PostgreSQL 只插入数据库中的空列,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31777583/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com