如何插入具有循环关系的表(SQL SERVER)
我正在处理数据库中一组似乎具有循环关系的表(见图)。这是艺术数据库,如果这对任何人都有帮助的话 用户登录:如何插入具有循环关系的表(SQL SERVER),sql,sql-server,tsql,foreign-key-relationship,circular-reference,Sql,Sql Server,Tsql,Foreign Key Relationship,Circular Reference,我正在处理数据库中一组似乎具有循环关系的表(见图)。这是艺术数据库,如果这对任何人都有帮助的话 用户登录: a) 必须创建(插入到)会话,该会话反过来需要SessionStartTransactionID(=SignOnTransaction) b) SignOnTransaction是ControlTransaction的一种类型 c) ControlTransaction是一种事务类型 d) 事务需要引用现有会话(以及操作员等) 注意: Transaction表中的Transactio
- a) 必须创建(插入到)会话,该会话反过来需要SessionStartTransactionID(=SignOnTransaction)
- b) SignOnTransaction是ControlTransaction的一种类型
- c) ControlTransaction是一种事务类型
- d) 事务需要引用现有会话(以及操作员等)
谢谢 如果你所描述的东西是不可能的,那么你理解错了。不能让表A具有引用表A的必需键的表B具有引用表A的必需键。这两个键中的一个必须为Null,否则foregin键关系不会被强制 一些想法 假定会话将StartTransactionID用作其主键的一部分,则表示它不能为null,因此事务中的StartTransactionID可能为null,因此您可以插入事务,然后插入ControlTransaction,然后签名Transaction,然后是Session,然后更新使用该id创建的事务。(如果没有强制执行FK,则可以跳过更新,如果PK不是标识列,则只需对PK使用相同的值) 我能想到的唯一其他可能的解决方案是,每次首次插入事务时,都必须使用
ALTER TABLE Transaction NOCHECK CONSTRAINT StartTransactionIDconstraint\u name
,然后在更新表后恢复该约束。这看起来确实是一个黑客解决方案。尤其是bec因为你不能在一个事务中做一个altertable
,这样你就会面临很多问题
既然这似乎是生产系统的一部分,为什么不运行SQL跟踪来查看数据是如何填充的。这对我一直都有帮助。您可以在事务内部使用
alter table
。但这不是一个好的解决方案。@Daniel Gimenez感谢您的输入。我理解这个问题,但希望有一个ele甘特解决方案,例如,在事务中插入所有4个表,然后以某种方式填充(我认为这在Oracle中是可能的?)。严格地说,事务表不需要引用回会话,因为已经存在一个来自表会话登录控制事务表的链接。ARTS consortium设计了这样的东西,但它不起作用,这让我很恼火。