【问题标题】:Create a one to many relationship using SQL Server使用 SQL Server 创建一对多关系
【发布时间】:2009-08-20 19:31:30
【问题描述】:

如何使用 SQL Server 创建一对多关系?

【问题讨论】:

  • 我在南加州大学的教授告诉我们一个简单的规则:当存在一对多关系时,将'one'端的键作为外键放在'many'端。当存在多对多关系时,将两个键作为外键放在第三张表中。

标签: sql sql-server sql-server-2005


【解决方案1】:
  1. 使用自己的主键定义两个表(例如 A 和 B)
  2. 将表 A 中的列定义为具有基于表 B 主键的外键关系

这意味着表 A 可以有一个或多个与表 B 中的单个记录相关的记录。

如果您已经准备好表,请使用 ALTER TABLE 语句创建外键约束:

ALTER TABLE A ADD CONSTRAINT fk_b FOREIGN KEY (b_id) references b(id) 
  • fk_b:外键约束的名称,对数据库必须是唯一的
  • b_id: 表 A 中您正在创建外键关系的列的名称
  • b:表名,在本例中为 b
  • id: 表 B 中的列名

【讨论】:

  • 什么是“根据表 B 的主键将表 A 中的列定义为具有外键关系”的最简单方法
  • @George:更新为包含 ALTER TABLE ADD CONSTRAINT 命令,假设表存在。
  • 我认为应该是:ALTER TABLE A ADD CONSTRAINT fk_b FOREIGN KEY ( b_id ) references b(id)
  • 是的,请确保将 fk_b 放在 CONSTRAINT 而不是 FOREIGN KEY 之后。
  • 作为一个很好的答案的补充,在执行语句之前,需要确保表 A 中没有孤立记录。
【解决方案2】:

这是一个经典订单示例的简单示例。每个Customer可以有多个Order,每个Order可以由多个OrderLine组成。

您可以通过添加foreign key 列来创建关系。每个订单记录中都有一个 CustomerID,它指向客户的 ID。同样,每个 OrderLine 都有一个 OrderID 值。这是数据库图的外观:

在这张图中,有实际的foreign key constraints。它们是可选的,但它们可确保数据的完整性。此外,它们使您的数据库结构对任何使用它的人来说都更加清晰。

我假设您知道如何自己创建表格。然后你只需要定义它们之间的关系。您当然可以在 T-SQL 中定义约束(由几个人发布),但也可以使用设计器轻松添加它们。使用SQL Management Studio,可以右键Order表,点击Design(我觉得2005下可能叫Edit)。然后在打开的窗口中的任意位置右键单击并选择Relationships

你会得到另一个对话框,右边应该有一个网格视图。其中第一行是“Tables and Columns Specification”。单击该行,然后再次单击右侧出现的小 [...] 按钮。你会得到这个对话框:

Order 表应该已经在右侧被选中。选择左侧下拉列表中的客户表。然后在左侧网格中,选择ID 列。在右侧网格中,选择CustomerID 列。关闭对话框,然后下一个。按Ctrl+S保存。

具有此约束将确保没有伴随的客户记录就不会存在任何订单记录。

要有效地查询这样的数据库,您可能需要read up on JOINs

【讨论】:

    【解决方案3】:

    这是我通常的做法(sql server)。

    Create Table Master (
    MasterID int identity(1,1) primary key,
    Stuff varchar(10)
    )
    GO
    Create Table Detail (
    DetailID int identity(1,1) primary key,
    MasterID int references Master, --use 'references'
    Stuff varchar(10))
    GO
    Insert into Master values('value')
    --(1 row(s) affected)
    GO
    Insert into Detail values (1, 'Value1') -- Works
    --(1 row(s) affected)
    insert into Detail values (2, 'Value2') -- Fails
    --Msg 547, Level 16, State 0, Line 2
    --The INSERT statement conflicted with the FOREIGN KEY constraint "FK__Detail__MasterID__0C70CFB4". 
    --The conflict occurred in database "Play", table "dbo.Master", column 'MasterID'.
    --The statement has been terminated.
    

    正如您所见,由于外键,第二次插入细节失败。 这是一个很好的网络链接,显示了在创建表期间或之后定义 FK 的各种语法。

    http://www.1keydata.com/sql/sql-foreign-key.html

    【讨论】:

      【解决方案4】:

      如果您不使用 SSMS,那么语法如下:

      ALTER TABLE <table_name>
      ADD <constraint_name> FOREIGN KEY 
      (<column_name1> ,
      <column_name2> )
      REFERENCES <table_name>
      (<column_name1> ,
      <column_name2>)
      

      http://infogoal.com/sql/sql-add-foreignkey.htm

      【讨论】:

        【解决方案5】:

        如果您在谈论两种实体,比如教师和学生,您将为每个实体创建两个表,并为第三个表创建存储关系。第三个表可以有两列,比如teacherID 和StudentId。 如果这不是您要查找的内容,请详细说明您的问题。

        【讨论】:

        • 我不认为这是我想要的。我标准化了一个表,现在我想创建一个关系。
        • 由于提供的解决方案是多对多关系的解决方案,因此投票否决。即使使用一对多,这在必须运行连接时也是额外的开销。另外,您必须跨 3 个表进行内部连接,因此需要输入更多内容。
        • 这个是用来建立m-n关系的:)
        • 没必要。当我们有多对多关系时,建议创建第三个表
        猜你喜欢
        • 1970-01-01
        • 2023-03-16
        • 1970-01-01
        • 1970-01-01
        • 2014-08-11
        • 2013-01-18
        • 1970-01-01
        • 2023-03-09
        • 2012-05-04
        相关资源
        最近更新 更多