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