如何检查PostgreSQL中的行数一致性?

时间:2014-05-13 10:34:05

标签: postgresql triggers consistency

我有一个用于保存各种表单的数据库。我有一张表格:

CREATE SEQUENCE seq_formtype;

CREATE TABLE formtype (
    id_ft integer NOT NULL DEFAULT nextval('seq_formtype'),
    name text
);

我有一个表格中包含不同输入字段的表格:

CREATE SEQUENCE seq_formstruct;

CREATE TABLE formstruct (
    id_fs integer NOT NULL DEFAULT nextval('seq_formstruct'),
    id_ft integer NOT NULL,
    name text,
    id_fstype text NOT NULL
);

最后,我有一张表格,其中存储了每个试验表格的结果。

CREATE TABLE results (
    id_trial integer NOT NULL,
    id_fs integer NOT NULL,
    res_value text
);

当我添加结果时,我想检查是否已插入来自formtruct的所有输入 - 这意味着formstruct where formtype = typ_trialu(伪代码)中的每个条目都会有结果中的条目。

现在我甚至不确定如何检查或从哪里开始。我的想法是创建一个触发器,在插入结果后检查一致性(即插入所有inputfield结果后)。

1 个答案:

答案 0 :(得分:1)

可以在插入语句后使用触发器完成。

CREATE TRIGGER check_form_types_trigger
    AFTER INSERT ON results
    FOR EACH STATEMENT
    EXECUTE PROCEDURE check_form_types_function();

而且,在check_form_types_function(应该是plpgsql)中,如果您的数据(整体上)不一致,您可以raise an exception

但是,另一方面,如果你这样做,你实际上无法将部分数据插入results;您只能使用单个插入语句插入整个数据。如果你真的关心一致性,你应该在每次更新后进行检查。删除语句。

备注

  • fsftfstype等名称很糟糕,请考虑重命名您的列。
  • 考虑使用SERIAL s(而不仅仅是手动设置序列)
  • 考虑使用foreign keys