How to do an INSERT into tables with circular relationships (SQL SERVER)

我怕爱的太早我们不能终老 提交于 2019-12-12 05:54:15

问题


I'm dealing with a set of tables in a database that appear to have a circular relationship (see image). This is the ARTS database if that is of any help to anyone.

A user signing on:

  • a) must create a (insert into) session, which in turn needs a SessionStartTransactionID (=SignOnTransaction)
  • b) a SignOnTransaction is a type of ControlTransaction
  • c) a ControlTransaciton is a type of Transaction
  • d) a Transaction needs a reference to an existing Session (along with Operator, etc.)

Note: The Transaction.SessionStartTransactionID,Transaction.OperatorID, and Transaction.WorkStationID (thoese 3 are the composite primary key in Session) cannot be NULL in the Transaction table.

I can't figure out how to create (insert into) SignOnTransaction, or insert into any of the tables mentioned above.

How do you do that in SQL Server? Is that even possible? Where would I start? Thanks!


回答1:


If something you're describing is impossible, then you're understanding it wrong. You can't have table A that has a required Key that references table B that has a required key that references table A. One of the two keys has to be nullable, or foregin key relationships aren't being enforced.

Some ideas

Given that Session uses StartTransactionID as part of its primary key means that it can't be null, so it seems likely that StartTransactionID in Transaction can be null, so that you insert Transaction, then ControlTransaction then SignOnTransaction then Session, then update the Transaction that was created with the id. (If the FK was not enforced, you can skip the update, and just use the same value for the PK if it isn't an Indentity column).

The only other possible solution I can think of is that you have to use an ALTER TABLE Transaction NOCHECK CONSTRAINT StartTransactionIDconstraint_name every time you first insert into Transaction, and then restore the constraint after you update the table. Seems like a hackish solution to be sure. Especially because you can't do an ALTER TABLE in a transaction so that you leave yourself open for a ton of problems.

...

Since this appears to be part of a production system, why don't you run a SQL Trace to see how the data is getting populated. This helps me all the time.



来源:https://stackoverflow.com/questions/26444644/how-to-do-an-insert-into-tables-with-circular-relationships-sql-server

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!