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
請讓我知道我要去哪裏錯了。
這似乎表明你並不需要觸發器(數據庫無論如何都會拒絕無效的數據)。你可能想要的是一個自定義函數,它可以從varchar轉換爲date,並以你描述的方式修復無效輸入(或者讓應用程序代碼處理它)。 – Thilo
@ lad2025:感謝您的評論。但是沒有辦法修改上面的觸發器來忽略這些值,而是用正確的值替換它們。 – arsm4
@Thilo你可以讓我引導我更多的如何創建這個自定義函數插入前發生。我這樣說的原因是,我的表格有很多列,而且由於這個不支持的時間戳,沒有任何內容填充到所需的其他列中。因此,我想在數據庫級別創建一個觸發器來糾正這些值,以便整個插入操作不會失敗。我希望你明白 – arsm4