如何检查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.),这会自动设置序列(幕后),并使代码更简单,更具可读性。