Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/77.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何插入具有循环关系的表(SQL SERVER)_Sql_Sql Server_Tsql_Foreign Key Relationship_Circular Reference - Fatal编程技术网

如何插入具有循环关系的表(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) 事务需要引用现有会话(以及操作员等)
注意: Transaction表中的Transaction.SessionStartTransactionID、Transaction.OperatorID和Transaction.WorkStationID(这3是会话中的复合主键)不能为空。

我不知道如何创建(插入到)SignOnTransaction,或插入到上面提到的任何表中

在SQL Server中如何做到这一点?这可能吗? 我从哪里开始?
谢谢

如果你所描述的东西是不可能的,那么你理解错了。不能让表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设计了这样的东西,但它不起作用,这让我很恼火。