2017-08-13 38 views
0

我在我的PostgreSQL環境中創建了以下觸發器來阻止插入0000-00-00我的時間戳中的00:00:00數據類型字段,因爲它不受支持。PostgreSQL在插入觸發器之前進行阻止0000-00-00 00:00:00

create function my_trigger_func() returns trigger as $$ 
begin 
    if NEW.t_date = '0000-00-00 00:00:00' then 
     NEW.t_date := '0001-01-01 00:00:00'; 
    end if; 
    return new; 
end 
$$ language plpgsql; 

CREATE TRIGGER my_trigger 
BEFORE INSERT ON timezone.test 
FOR EACH ROW 
EXECUTE PROCEDURE my_trigger_func() 

上述觸發函數被成功創建。但在那之後,當我執行下面的INSERT命令:

Insert into timezone.test (t_id,t_date) values ('3','0001-01-01 01:10:01'); 

我收到以下錯誤:

ERROR: date/time field value out of range: "0000-00-00 00:00:00" 
LINE 1: SELECT NEW.t_date = '0000-00-00 00:00:00' 
          ^
QUERY: SELECT NEW.t_date = '0000-00-00 00:00:00' 
CONTEXT: PL/pgSQL function my_trigger_func() line 3 at IF 
********** Error ********** 

ERROR: date/time field value out of range: "0000-00-00 00:00:00" 
SQL state: 22008 
Context: PL/pgSQL function my_trigger_func() line 3 at IF 

請讓我知道我要去哪裏錯了。

回答

2

Kindly let me know where am I going wrong.

簡單,你嘗試比較:

IF NEW.t_date   = '0000-00-00 00:00:00' THEN 
    (type timestamp)  literal -> conversion to Timestamp 

'0000-00-00 00:00:00' - >時間戳無效

而且因爲這觸發的,你不能插入連正確的價值觀。我會建議在應用程序中糾正它,並插入適當的值。

+3

這似乎表明你並不需要觸發器(數據庫無論如何都會拒絕無效的數據)。你可能想要的是一個自定義函數,它可以從varchar轉換爲date,並以你描述的方式修復無效輸入(或者讓應用程序代碼處理它)。 – Thilo

+0

@ lad2025:感謝您的評論。但是沒有辦法修改上面的觸發器來忽略這些值,而是用正確的值替換它們。 – arsm4

+0

@Thilo你可以讓我引導我更多的如何創建這個自定義函數插入前發生。我這樣說的原因是,我的表格有很多列,而且由於這個不支持的時間戳,沒有任何內容填充到所需的其他列中。因此,我想在數據庫級別創建一個觸發器來糾正這些值,以便整個插入操作不會失敗。我希望你明白 – arsm4