在创建表时在SQL中声明某些条件的最佳实践?

时间:2016-06-28 19:11:38

标签: sql postgresql database-design

想象一下,我创建了一些表:

CREATE TABLE mytable AS
...

现在我想进行一些健全性检查,验证mytable.的每个记录的某些条件是否正确我可以将此问题框起来检查另一个查询的结果是否返回零结果。

SELECT count(*)
FROM mytable
WHERE something_horrible_is_true

如果计数不等于零,是否有一种标准的推荐方法来产生错误?为了使某些事情发生,如果我使用java.sql.Statement执行此完整性检查查询,则会触发SQLException?

这是一种合理的方法吗?或者这是一种更好的方法来强制创建表时某些条件总是如此? (我使用Postgresql。)

2 个答案:

答案 0 :(得分:1)

你熟悉触发器吗? Postresql为触发器提供了良好的支持,特别是使用pgsql laguange。

触发器是一个始终在事件上运行的函数(check):insert,update,delete。您可以在活动之前或之后调用该功能。

我相信一旦你了解这个概念,你就可以找到一个帮助你实现目标的在线教程。

一般方法可能如下所示:

CREATE FUNCTION trigger_function() RETURN trigger AS
$$
DECLARE c integer;
BEGIN
SELECT count(*) into c FROM mytable WHERE something_horrible_is_true;
IF c>0 then  RAISE EXCEPTION 'cannot have a negative salary'; 
END IF; 
return new; 
END;
$$ LANGUAGE plpgsql;

然后你执行

CREATE TRIGGER trigger_name BEFORE INSERT
   ON table_name
   FOR EACH ROW
   EXECUTE PROCEDURE trigger_function()

两个代码部分都是pqsql。

答案 1 :(得分:1)

创建函数以引发异常:

SELECT case when count(*) > 0 then raise_error('something horrible is true!') end
FROM mytable
WHERE something_horrible_is_true

然后您可以在常规SQL中使用它:

something_horrible_is_true

如果存在满足SELECT case when count(*) = 0 then raise_error('something horrible is true!')::int else count(*) end FROM mytable WHERE something_horrible_is_true 条件的行,则会在此处获得SQL异常。

还有一些更复杂的用法示例:

update mytable set
  mydatefield = 
    case 
      when mydatefield = current_date then raise_error('Can not update today''s rows')::date
      else '1812-10-10'::date
    end;

找不到任何内容时返回计数或上升异常。

{{1}}

防止更新某些行(这是一个有点人为的例子,但它显示了另一种使用方式)
......等等。