2016-09-30 80 views
2

时插入一些东西我对SQL和PostgreSQL还是比较陌生的,特别是对于我来说,请在这个裸机上!Postgres规则:当条件为

我有两张表,一张带有电影列表,另一张带有播放每部电影时的日期列表。电影列表具有列name,id,start_dateend_date,而id是唯一标识符。

显示列表(具有日期的那个)具有id,movie_iddate

每次我INSERT一个新节目,我想电影名单进行更新:如果show.datemovie.start_date之前,我想的start_date被更新到show.date的价值。同样的结束日期 - 显然如果show.datemovie.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(); 

该触发可能会或可能无法正常工作,它解决了我的问题,但不回答我的原始问题... 其他任何人比我更聪明(我当然希望如此!)?

+0

为什么不只是省略'start_date'&计算每当需要加入&MIN(shows.date)'? – pozs

+0

冗余数据的问题:需要将其更新到永恒。 – joop

+0

那么,这将是一个解决方案......尽管学习如何处理规则,但;)出于兴趣,但是,当我每周插入插入内容并在电影中选择时,会更快每分钟至少一次? – Maverick283

回答

1

movieswhere子句中未知。用途:

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 
    ); 
0

的错误消息振振有辞是您在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>); 

因为只有日期之一在moviesid = 42将被更改。

规则很棘手,很难理解。

你最好用触发器。