Postgres规则:当条件为
时插入一些东西我对SQL和PostgreSQL还是比较陌生的,特别是对于我来说,请在这个裸机上!Postgres规则:当条件为
我有两张表,一张带有电影列表,另一张带有播放每部电影时的日期列表。电影列表具有列name
,id
,start_date
和end_date
,而id是唯一标识符。
显示列表(具有日期的那个)具有id
,movie_id
,date
。
每次我INSERT
一个新节目,我想电影名单进行更新:如果show.date
是movie.start_date
之前,我想的start_date
被更新到show.date
的价值。同样的结束日期 - 显然如果show.date
在movie.end_date
之后。
下面的规则是什么我坚持:(注意:它只会设定开始日期,如果它的工作,让做应该很容易,一旦这个工程的结束日期...)
CREATE RULE "movies_start_date_setter" AS ON INSERT TO "shows"
WHERE movies.id = NEW.movie_id AND movies.start_date < NEW.date
DO (UPDATE movies SET start_date = NEW.date);
它返回:ERROR: missing FROM-clause entry for table "movies"
这个错误不会给我(作为初学者)任何信息,我错过了一个FROM子句和原因。
现在,因为大家似乎认为一个规则是一个坏主意(我倾向于压力)我尝试了一个触发器,这对我来说是完全新的。
使用触发器(强烈推荐)它会是这个样子:
CREATE OR REPLACE FUNCTION adjust_start_date()
RETURNS trigger AS
$BODY$
BEGIN
UPDATE movies SET start_date = NEW.date
WHERE id = NEW.movie_id AND start_date > NEW.date;
RETURN NEW;
END;
$BODY$
LANGUAGE 'plpgsql';
其次:
CREATE TRIGGER adjust_start_date_trigger
AFTER INSERT
ON shows
FOR EACH ROW
EXECUTE PROCEDURE adjust_start_date();
该触发可能会或可能无法正常工作,它解决了我的问题,但不回答我的原始问题... 其他任何人比我更聪明(我当然希望如此!)?
表movies
在where
子句中未知。用途:
create rule movies_start_date_setter as
on insert to shows do (
update movies
set start_date = new.date
where id = new.movie_id and start_date > new.date
);
的错误消息振振有辞是您在WHERE
子句中引用表movies
。
您可以尝试使用查询重写规则是这样的:
CREATE RULE movies_start_date_setter AS
ON INSERT TO shows DO ALSO
UPDATE movies
SET start_date = LEAST(NEW.date, start_date),
end_date = GREATEST(NEW.date, end_date)
WHERE id = NEW.movie_id
AND NEW.date NOT BETWEEN start_date AND end_date;
,但这样不会多线工作INSERT
S:
INSERT INTO shows (id, movie_id, date) VALUES
(1, 42, <very small date>),
(2, 42, <very large date>);
因为只有日期之一在movies
排id = 42
将被更改。
规则很棘手,很难理解。
你最好用触发器。
为什么不只是省略'start_date'&计算每当需要加入&MIN(shows.date)'? – pozs
冗余数据的问题:需要将其更新到永恒。 – joop
那么,这将是一个解决方案......尽管学习如何处理规则,但;)出于兴趣,但是,当我每周插入插入内容并在电影中选择时,会更快每分钟至少一次? – Maverick283