我有一个“主表”,称为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条目
  • ,但是永远不会是没有IllegalCustomer条目

  • 我的直觉是在SQL Server数据库图中拖动
  • IllegalCustomers

  • 向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/

    10-13 02:50