我不确定这是否设计得很好,如果不满意,请告诉我如何做到这一点。
我有:
TableA (TableA_ID int identity PK, Value varchar(10), TableB_ID PK not null)
TableB (TableB_ID int identity PK, Value varchar(10), TableA_ID PK not null)
目标很简单:
TableA是“父表”,TableB是“儿童表”,就像父母应该有一个或多个孩子一样,每个孩子只能有一个父母。
这是对的吗?
我遇到的问题是当我尝试执行INSERT语句时,如果这是正确的,我应该如何进行INSERT?临时禁用约束?
谢谢!
我遇到的问题是当我尝试插入
时答案 0 :(得分:1)
TableA (TableA_ID int identity PK, Value varchar(10))
TableB (TableB_ID int identity PK, Value varchar(10), TableA_ID not null)
作为父表,表a不需要引用表b,因为表要求表a中有一个字段。这被称为一对多的关系。
所以在表a中你可能有这些值:
1 a
2 b
3 c
在表b中你可以有这些:
1 asdf 1
2 sdfg 1
3 pof 2
4 dfgbsd 3
现在您可以进行查询以显示表a中的数据:
select b.TableB_ID, b.Value, a.TableA_ID, a.Value
from TableB b
inner join TableA
on b.TableA_ID=a.TableA_ID
答案 1 :(得分:0)
父母不依赖孩子。您需要删除表A中对表B的引用。
答案 2 :(得分:0)
你有一个循环依赖。这些对于声明性强制执行并不是很有效,每次要插入时都必须禁用约束。
答案 3 :(得分:0)
这是一个不寻常的要求。如果我坚持下去(我会真的回过头来确保它确实是一个要求)我会这样设计:
从表a到表b创建一个常规外键,其中包含父项,b表示子项。
向表a添加触发器,如果在插入表记录时不存在记录,则将记录插入表b。向表b添加另一个触发器,如果删除表b中的最后一个相关记录,则删除表中的记录。
或者,您可以将插入放在存储过程中的两个表中。除了proc之外,删除表的所有插入权限。你仍然需要从tablea到表b的外键关系和表b上的触发器,以确保如果删除了最后一条记录,则删除一条记录。但是在这种情况下你可以取消表a上的触发器。
我会使用第一个场景,除非表b中的信息无法从表a上的触发器中找到,比如一个或多个必需字段没有值,您可以从表格a中找到。
答案 4 :(得分:0)
我会将插入放入proc:禁用约束,插入数据,启用约束。您可能需要确保这是在禁用约束时进行的唯一事务。
可以通过使隔离级别为SERIALIZABLE来实现,但这反过来可能会影响你的并发性。
千电子伏