这是正常的行为吗?如果是这样,有没有办法得到我想要的行为(没有违规行为)?
编辑:
我原创创建外键作为CREATE table的一部分,只是使用
... REFERENCES product (ID) ON UPDATE CASCADE ON DELETE CASCADE
当前的代码pgadmin3给出
ALTER table cultivar ADD CONSTRAINT cultivar_ID_fkey FOREIGN KEY (ID) REFERENCES product (ID) MATCH SIMPLE ON UPDATE CASCADE ON DELETE CASCADE;
编辑2:
要澄清,我有一个偷偷的怀疑,只有在更新/插入发生时才会检查这些约束,但是再次看不到。不幸的是,我不太了解postgres,以确定这是否是真的,或者如果没有运行这些检查,那么字段可能会在数据库中最终出现。
如果是这种情况,是否有办法检查所有的外键并修复这些问题?
编辑3:
一个限制违规可能是由错误的触发引起的,见下文
我试图创建一个简单的例子,显示外键约束被强制执行。有了这个例子,我证明我不允许输入违反fk的数据,我证明如果fk在插入过程中不到位,并且我启用fk,fk约束会引发一个错误,告诉我数据违反了fk。所以我没有看到你的表中的数据违反了一个fk的位置。我在9.0,但这不应该在8.3不同。如果您可以显示一个证明您可能有帮助的问题的工作示例。--CREATE tableS--CREATE table parent( parent_ID integer NOT NulL,first_name character varying(50) NOT NulL,CONSTRAINT pk_parent PRIMARY KEY (parent_ID))WITH ( OIDS=FALSE);ALTER table parent OWNER TO postgres;CREATE table child( child_ID integer NOT NulL,parent_ID integer NOT NulL,CONSTRAINT pk_child PRIMARY KEY (child_ID),CONSTRAINT fk1_child FOREIGN KEY (parent_ID) REFERENCES parent (parent_ID) MATCH SIMPLE ON UPDATE CASCADE ON DELETE CASCADE)WITH ( OIDS=FALSE);ALTER table child OWNER TO postgres;--CREATE tableS----INSERT TEST DATA--INSERT INTO parent(parent_ID,first_name)SELECT 1,'Daddy'UNION SELECT 2,'Mommy';INSERT INTO child(child_ID,parent_ID,1,'Billy'UNION SELECT 2,'Jenny'UNION SELECT 3,'Kimmy'UNION SELECT 4,2,'Billy'UNION SELECT 5,'Jenny'UNION SELECT 6,'Kimmy';--INSERT TEST DATA----SHOW THE DATA WE HAVE--select parent.first_name,child.first_namefrom parentinner join child on child.parent_ID = parent.parent_IDorder by parent.first_name,child.first_name asc;--SHOW THE DATA WE HAVE----DELETE PARENT WHO HAS CHILDREN--BEGIN TRANSACTION;delete from parentwhere parent_ID = 1;--Check to see if any children that were linked to Daddy are still there?--None there so the cascade delete worked.select parent.first_name,child.first_namefrom parentright outer join child on child.parent_ID = parent.parent_IDorder by parent.first_name,child.first_name asc;RolLBACK TRANSACTION;--TRY ALLOW NO referential DATA IN--BEGIN TRANSACTION;--Get rID of fk constraint so we can insert red headed step childALTER table child DROP CONSTRAINT fk1_child;INSERT INTO child(child_ID,first_name)SELECT 7,99999,'Red headed Step Child';select parent.first_name,child.first_name asc;--Will throw FK check violation because parent 99999 doesn't exist in parent tableALTER table child ADD CONSTRAINT fk1_child FOREIGN KEY (parent_ID) REFERENCES parent (parent_ID) MATCH SIMPLE ON UPDATE CASCADE ON DELETE CASCADE;RolLBACK TRANSACTION;--TRY ALLOW NO referential DATA IN----DROP table parent;--DROP table child;总结
以上是内存溢出为你收集整理的postgresql中的外键可能被触发器所违反全部内容,希望文章能够帮你解决postgresql中的外键可能被触发器所违反所遇到的程序开发问题。
如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)