Database PostgreSQL仅插入数据库中的空列

Database PostgreSQL仅插入数据库中的空列,database,postgresql,Database,Postgresql,我很难理解什么是新的和旧的。这里是一个MWE,显示了我正在努力实现的目标。我试图做到的是,如果已经有了一些东西,就不要在其他东西中添加一些东西。把它想象成一个停车场。如果已经有新车的话,新车就进不去了。现在我只检查第一个停车位。最后我想检查一下这三个 DROP TABLE IF EXISTS Parking CASCADE; CREATE TABLE IF NOT EXISTS Car ( id SERIAL PRIMARY KEY ); CREATE TABLE IF NOT EXI

我很难理解什么是
新的
旧的
。这里是一个MWE,显示了我正在努力实现的目标。我试图做到的是,如果已经有了一些东西,就不要在其他东西中添加一些东西。把它想象成一个停车场。如果已经有新车的话,新车就进不去了。现在我只检查第一个停车位。最后我想检查一下这三个

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

我不明白为什么第二个和第三个update语句不起作用。我怀疑这与
新的
旧的
有关,我只是不明白我在做什么。更糟糕的是,我没有看到任何例外。

我的逻辑有一个缺陷,原因是对
旧的
新的
缺乏理解。结果是,
NEW
返回整个新行,甚至是未更新的列。如果有人知道如何隔离已更改的列,那将是一个很大的帮助。同时,我通过添加以下内容解决了这个问题

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

我的逻辑有一个缺陷,原因是对
旧的
新的
缺乏理解。结果是,
NEW
返回整个新行,甚至是未更新的列。如果有人知道如何隔离已更改的列,那将是一个很大的帮助。同时,我通过添加以下内容解决了这个问题

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

如果旧的.spot1与新的.spot1不同,则可以将您的
简化为
,然后
识别修改列的一种方法是:@a_horse_,乍一看没有名字,
不同,因为它将
null
视为现有汽车,因此,新车只有在空车离开后才能停车如果你的
可以简化为
如果旧的.spot1与新的.spot1不同,那么
识别修改列的一种方法是:@a_horse_,乍一看没有名字,
不同,因为它将
null
视为现有的汽车,因此,除非空车先离开,否则新车不能停车。对于我来说,最后两个
更新
查询不起作用,因为在
停车
表中,只有一行,因此,对于我来说,
id=2
id=3
没有行,因为在
Parking
表中只有一行,所以没有
id=2
id=3