2009-08-20 104 views
41

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

+2

我在USC的教授告诉我们这个简单的规则:当有一对多的关系时,把'一边'作为外键放在'多边'一边。当有多对多的关系时,把两个键作为外键放在第三个表中。 – user3885927 2017-08-02 22:22:18

回答

71
  1. 定义的两个表(例如A和B),用自己的主键
  2. 定义于表A中的列作为基于表B的

主键具有外键关系这意味着该表中可以有一个或多个与在表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列的名称
+0

“将表A中的列定义为具有基于表B的主键的外键关系”的最简单方法是什么 – Tim 2009-08-20 19:35:17

+0

@George:已更新以包含ALTER TABLE ADD CONSTRAINT命令(假设存在表)。 – 2009-08-20 19:54:33

+0

你对此解释完全谢谢。希望微软最终会学习如何做同样的事情。 – Lopsided 2013-07-02 17:50:25

0

如果你在谈论关于两类不同enitities的,老师和学生说,你会为每个创建两个表,第三个存储关系。这第三个表格可以有两列,比如teacherID和StudentId。 如果这不是你正在寻找的,请详细说明你的问题。

+0

我不认为这是我想要的。我规范化了一张桌子,现在我想创建一个关系。 – Tim 2009-08-20 19:38:38

+5

由于所提供的解决方案是向下投票,因此是多对多关系之一。即使使用一对多,当必须运行连接时,这也是额外的开销。另外,您必须在3个表格内部连接,因此需要更多类型的连接。 – andrewWinn 2009-08-20 19:40:00

+0

这个是用来创建m-n关系的:) – nXqd 2011-01-14 20:37:05

2

这是怎么了,我通常做(SQL服务器)。

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

58

这是一个典型的例子令一个简单的例子。每个客户可以有多个订单 s,并且每个订单可以包括多个订单行 s。

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

SQL one-to-many diagram http://www.subbot.net/personal/external/stackoverflow/sql-one-to-many.png

在此图中,有实际foreign key constraints。它们是可选的,但它们确保数据的完整性。另外,它们使数据库的结构更清晰,以供使用它的任何人使用。

我假设你知道如何自己创建表。那么你只需要定义它们之间的关系。您当然可以在T-SQL中定义约束(由多人发布),但也可以使用设计器轻松添加。使用SQL Management Studio,你可以右击订单表,点击设计(我认为它可能被称为2005年编辑)。然后,在打开右键单击的窗口中的任意位置选择关系

你会得到另一个对话框,在右边应该有一个网格视图。第一行的其中一行显示“表格和列说明”。点击该行,然后再次点击右侧出现的小[...]按钮。你会得到这个对话框:

Foreign key constraint http://www.subbot.net/personal/external/stackoverflow/sql-fk.png

订购表应该已经在正确的选择。选择左侧下拉菜单中的客户表。然后在左侧网格中,选择ID列。在右侧网格中,选择CustomerID列。关闭对话框,然后关闭对话框。按Ctrl + S保存。

拥有这个约束将确保在没有伴随的客户记录的情况下不存在订单记录。

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