当表A依赖于表B时,如何向表A插入新记录,反之亦然

时间:2009-05-06 18:32:38

标签: sql-server database-design

我不确定这是否设计得很好,如果不满意,请告诉我如何做到这一点。

  • 我正在使用Sql Server 2008

我有:

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)

目标很简单:

  • 只有TableB中至少有一行与TableA相关联时,TableA才能有行;
  • 对于TableB中的每一行,TableA中必须有一行与之关联;

TableA是“父表”,TableB是“儿童表”,就像父母应该有一个或多个孩子一样,每个孩子只能有一个父母。

这是对的吗?

我遇到的问题是当我尝试执行INSERT语句时,如果这是正确的,我应该如何进行INSERT?临时禁用约束?

谢谢!

我遇到的问题是当我尝试插入

5 个答案:

答案 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来实现,但这反过来可能会影响你的并发性。

千电子伏