postgresql中的外键可能被触发器所违反

postgresql中的外键可能被触发器所违反,第1张

概述我在postgres中创建了一些表,从一个表添加了一个外键到另一个表,并将ON DELETE设置为CASCADE。奇怪的是,我有一些似乎违反这个约束的领域。 这是正常的行为吗?如果是这样,有没有办法得到我想要的行为(没有违规行为)? 编辑: 我原创创建外键作为CREATE TABLE的一部分,只是使用 ... REFERENCES product (id) ON UPDATE CASCADE ON 我在postgres中创建了一些表,从一个表添加了一个外键到另一个表,并将ON DELETE设置为CASCADE。奇怪的是,我有一些似乎违反这个约束的领域。

这是正常的行为吗?如果是这样,有没有办法得到我想要的行为(没有违规行为)?

编辑:

我原创创建外键作为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中的外键可能被触发器所违反所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: https://www.outofmemory.cn/sjk/1171174.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-06-02
下一篇 2022-06-02

发表评论

登录后才能评论

评论列表(0条)

保存