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

如何检查PostgreSQL中的行数一致性?,postgresql,triggers,consistency,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 int

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

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
);
当我添加结果时,我想检查是否插入了来自formstruct的所有输入-这意味着对于
formstruct中的每个条目,其中formtype=typ\u trialu
(伪代码)在结果中有一个条目


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

这可以通过insert语句后的触发器来完成

CREATE TRIGGER check_form_types_trigger
    AFTER INSERT ON results
    FOR EACH STATEMENT
    EXECUTE PROCEDURE check_form_types_function();
而且,在
中,如果数据(作为一个整体)不一致,可以检查表单类型功能

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

注释

    >名称>代码> FS,<代码> FT,<代码> FSTYPE 很糟糕,考虑重新命名您的列。
  • 考虑使用s(而不仅仅是手动设置序列)
  • 考虑使用

实际上,上面的代码使用外键,我只是想显示shortes代码,但谢谢您的提示。此外,出于某种原因,我不得不决定不使用串行数据类型,但我不记得为什么,因此我将再次查看它,因为现在我找不到串行数据类型的问题。不管怎样,我认为串行类型和使用序列是一样的,不是吗?(Offtopic-回答很好,我很感谢注释部分)@Pter几乎相同,但序列也有一个所有权(
子句拥有),如果您想删除表/列(拥有的序列也会删除,f.ex.),这会自动设置序列(幕后),并使代码更简单,更具可读性。