栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 面试经验 > 面试问答

如何处理相互递归的插入

面试问答 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

如何处理相互递归的插入

如果您使用数据修改CTE在 单个语句中
输入问题和答案,那么您甚至都不需要FK约束。更不用说实际制造(或发声)它们了-
这会贵得多。

DEFERRABLE``SET``DEFERRED


资料模型

首先,我清理了您的数据模型:

CREATE TABLE question (   question_id       serial PRIMARY KEY , correct_answer_id int  NOT NULL , question          text NOT NULL , solution          text NOT NULL);CREATE TABLE answer (   answer_id   serial PRIMARY KEY , question_id int  NOT NULL REFERENCES question , answer      text NOT NULL);ALTER TABLE question ADD ConSTRAINT question_correct_answer_id_fkeyFOREIGN KEY (correct_answer_id) REFERENCES answer(answer_id);
  • 不要使用非描述性的“ id”作为列名。
  • 不要使用基本类型名
    text
    作为列名。
  • 为了节省空间,将整数列放在第一位:
    • 在PostgreSQL中计算并节省空间
  • bigint
    没必要,
    integer
    就足够了。
  • 使用
    serial
    column简化您的架构定义。
  • 定义主键。PK列是
    NOT NULL
    自动的。

解决方案

我委派主键生成到序列(

serial
列)像它 应该 在大多数数据模型。我们可以使用语句的
RETURNING
子句获取自动生成的ID
INSERT
。但是在这种特殊情况下,我们每个人 需要 两个 ID
INSERT
,因此我
nextval()
开始使用其中的一个ID 。

WITH q AS (   INSERT INTO question (correct_answer_id, question, solution)   VALUES (nextval('answer_answer_id_seq'), 'How?', 'DEFERRABLE FK & wCTE')   RETURNING correct_answer_id, question_id   )INSERT INTO answer (answer_id, question_id, answer)SELECt correct_answer_id, question_id, 'Use DEFERRABLE FK & data-modifying CTE'FROM   q;

知道 序列(

'answer_answer_id_seq'
)的名称,因为我查找了它。这是默认名称。如果您不 知道
,请使用以下评论中提供的安全格式@IMSoP:

nextval(pg_get_serial_sequence('answer', 'answer_id'))

DEFERRABLE
DEFERRED
约束?

每个文档上

SETCONSTRAINTS

IMMEDIATE
在每个语句的末尾检查约束。

我的解决方案是一个 单一的 声明。这就是为什么它可以在两个单独的语句失败的地方工作的原因-是否包装在单个事务中。而且你需要

SETConSTRAINTS ...DEFERRED;
像IMSOP第一评论和@Jaaz在他的回答中实现。 但是,请注意免责声明的某些段落:

DEFERRABLE
还可以立即检查尚未声明的唯一性和排除约束 。

因此

UNIQUE
EXCLUDE
需要
DEFERRALBE
使wCTE为他们工作。这包括
PRIMARY KEY
约束。上的文档
CREATETABLE
具有更多详细信息:

非递延唯一性约束

当a

UNIQUE
PRIMARYKEY
约束不可延迟时,无论何时插入或修改一行,PostgreSQL都会立即检查其唯一性。SQL标准指出,唯一性应仅在语句末尾强制执行;否则,请参见参考资料。例如,当一个命令更新多个键值时,这会有所不同。为了获得符合标准的行为,请将约束声明为,
DEFERRABLE
但不要延迟(即
INITIALLYIMMEDIATE
)。请注意,这比立即进行唯一性检查要慢得多。



转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/456331.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号