2016-09-30 112 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將被更改。

規則很棘手,很難理解。

你最好用觸發器。