1)表格是否与多个表格具有一对一的关系!?
为了澄清更多,如果我想进行插入,第一个表将受到影响 只有其中一个表会受到影响。
2)如果是这样,主键将如何?
3)此外,如果我想检索多个记录,查询会是什么样子 从这些表中?
谢谢。
答案 0 :(得分:5)
表格是否与多个表格具有一对一的关系!?
是的,如果你的意思是1:0/1:
Create Table Parent
(
Id ... not null Primary Key
, ...
)
Create Table Child1
(
Id ... not null Primary Key
, Foreign Key ( Id ) References Parent ( Id )
...
)
Create Table Child2
(
Id ... not null Primary Key
, Foreign Key ( Id ) References Parent ( Id )
...
)
此设置需要先在父表中输入一个值,然后再输入子表(无特定顺序)。此外,您可以将一个值添加到其中一个子表而不是另一个,因为它们都只依赖于父表中存在的值而不是彼此。
<强>加成强>
要从子表中进行选择,它将涉及与任何其他父子关系相同的过程。例如:
Select P.Col1, P.Col2...
, Child1.Col1, Child1.Col2...
From Parent
Inner Join Child1
On Child1.FKCol = Parent.PKCol
通过在这里使用内部联接,我只返回存在子行的父行。如果您想要所有父行以及只有那些匹配的子行,您将使用左连接而不是内连接。如果要同时从多个子表中选择数据,可以在From子句中包含这些数据:
Select P.Col1, P.Col2...
, Child1.Col1, Child1.Col2...
, Child2.Col1, Child2.Col2...
, Child3.Col1, Child3.Col2...
From Parent
Left Join Child1
On Child1.FKCol = Parent.PKCol
Left Join Child2
On Child2.FKCol = Parent.PKCol
Left Join Child3
On Child2.FKCol = Parent.PKCol
答案 1 :(得分:1)
在SQL Server中,您当然可以设计一个能够表示此关系的数据库。您可以通过让子表使用ParentId作为主键并强制唯一性来强制执行一对一关系。
如果您想查询父表,并且它的三个子节点可能有也可能没有现有记录,您的查询将如下所示:
SELECT * FROM ParentTable as pt
LEFT JOIN ChildTable1 as ct1
ON pt.id = ct1.ParentId
LEFT JOIN ChildTable2 as ct2
ON pt.id = ct2.ParentId
LEFT JOIN ChildTable3 as ct3
ON pt.ID = ct3.ParentId
我的问题是你为什么要将一对一的关系分成多个表?如果将所有数据保存在一个表中,您还可以强制实施与数据的一对一关系。这样可以实现更清晰的查询(无连接)和更好的性能。