【发布时间】:2009-08-20 19:31:30
【问题描述】:
如何使用 SQL Server 创建一对多关系?
【问题讨论】:
-
我在南加州大学的教授告诉我们一个简单的规则:当存在一对多关系时,将'one'端的键作为外键放在'many'端。当存在多对多关系时,将两个键作为外键放在第三张表中。
标签: sql sql-server sql-server-2005
如何使用 SQL Server 创建一对多关系?
【问题讨论】:
标签: sql sql-server sql-server-2005
这意味着表 A 可以有一个或多个与表 B 中的单个记录相关的记录。
如果您已经准备好表,请使用 ALTER TABLE 语句创建外键约束:
ALTER TABLE A ADD CONSTRAINT fk_b FOREIGN KEY (b_id) references b(id)
fk_b:外键约束的名称,对数据库必须是唯一的b_id: 表 A 中您正在创建外键关系的列的名称b:表名,在本例中为 bid: 表 B 中的列名【讨论】:
ALTER TABLE A ADD CONSTRAINT fk_b FOREIGN KEY ( b_id ) references b(id)
这是一个经典订单示例的简单示例。每个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。
【讨论】:
这是我通常的做法(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 的各种语法。
【讨论】:
如果您不使用 SSMS,那么语法如下:
ALTER TABLE <table_name>
ADD <constraint_name> FOREIGN KEY
(<column_name1> ,
<column_name2> )
REFERENCES <table_name>
(<column_name1> ,
<column_name2>)
【讨论】:
如果您在谈论两种实体,比如教师和学生,您将为每个实体创建两个表,并为第三个表创建存储关系。第三个表可以有两列,比如teacherID 和StudentId。 如果这不是您要查找的内容,请详细说明您的问题。
【讨论】: