2017-08-13 79 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

相关问题