我有一个“主表”,称为Customers
:
CREATE TABLE Customers (
CustomerID int PRIMARY KEY NOT NULL,
FirstName nvarchar(50),
LastName nvarchar(50)
)
而且我有一个“卫星表”,将其称为
Customer_IllegallyObtainedInformation
:CREATE TABLE Customer_IllegallyObtainedInformation (
CustomerID int PRIMARY KEY NOT NULL,
CellPhonePin int,
SexualOrientation varchar(20),
EmailPassword varchar(50)
)
现在,我想要是从
Illegal
表回到主Customers
表的外键约束:换句话说:
Customer
,而没有成为Illegal
条目Illegal
的Customer
条目我的直觉是在SQL Server数据库图中拖动
Illegal
表到的Customers
表向SQL Server指示
Customers_IllegallyObtainedInformation
是关系中的“子级”。相反,该SQL Server中发生的事情使它成为一对一的关系:这意味着,如果您尝试插入
Customer
,它将失败,因为没有现有的Illegal
信息。如何在SQL Server中创建“父级-子级”或“一对一”关系?
注意:请勿将示例与问题混淆。我可以在
Illegal
表中创建一个牺牲主代理键:但这不是我的问题。
最佳答案
其他人已经指出了如何通过使用SQL脚本建立关系来实现所需的功能。我以为我只想对设计师的所作所为增加几分钱...
基本上,您向错误的方向拖动。
外键本身总是一对多的。这是一种通知DBMS的方法,即您拥有一个表(子表),在该表中您希望某个列(或多个列的组合)始终与另一个表中的键相对应。有了这些信息,DBMS便可以负责确保子表中的每一行实际上都满足此要求。
通过使该列也成为子表中的键,该关系实际上可以实现一对一,但是从DBMS的角度来看,这实际上并不是该关系的属性。相反,这只是对可以插入子表中的数据的另一种限制。
在设计器中创建关系时,似乎有人决定将主键拖到子表中。因此,当您从Customers_IllegallyObtainedInformation信息拖动到客户时,设计者会认为Customers_IllegallyObtainedInformation信息是包含主键的表。
但是,等等,为什么它与引入了代理 key 的第二个示例一起使用呢?可能是因为制作设计师的人决定使其变得更聪明。在这种情况下,您将拖动一个不是表中键的列。那不能形成关系中的主键,因此设计者检查该关系是否可以沿相反的方向形成。既然可以,那就是它所提供的...
关于sql-server - 在SQL Server中创建一对一可选约束,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/13167633/