使用SQL Server创build一对多的关系
如何使用SQL Server创build一对多的关系?
- 用自己的主键定义两个表(例A和B)
- 将表A中的列定义为具有基于表B的主键的外键关系
这意味着表A可以有一个或多个与表B中的单个logging相关的logging。
如果已经有了这些表,可以使用ALTER TABLE语句来创build外键约束:
ALTER TABLE A ADD CONSTRAINT fk_b FOREIGN KEY (b_id) references b(id)
-
fk_b
:外键约束的名称,对于数据库必须是唯一的 -
b_id
:您在表A上创build外键关系的列的名称 -
b
:表格的名称,在这种情况下b -
id
:表B中列的名称
这是一个典型Order例子的简单例子。 每个客户可以有多个订单 ,每个订单可以包含多个订单行 。
您可以通过添加外键列来创build关系。 每个订单logging都有一个CustomerID,它指向客户的ID。 同样,每个OrderLine都有一个OrderID值。 这是数据库图表的外观:
SQL一对多图personal/external/stackoverflow/sql-one-to-many.png
在这个图中,有实际的外键约束 。 它们是可选的,但它们确保数据的完整性。 而且,他们使数据库的结构更清晰,使用它的任何人。
我假设你知道如何自己创build表。 那么你只需要定义它们之间的关系。 您当然可以在T-SQL中定义约束条件(由多个人发布),但也可以使用devise器轻松添加。 使用SQL Management Studio,您可以右键单击订单表,单击devise (我认为它可能在2005年被称为编辑)。 然后在打开的右键单击并select关系的窗口中的任何地方。
你会得到另一个对话框,在右边应该有一个网格视图。 第一行的一行是“ 表格和列说明 ”。 点击该行,然后再次点击右侧出现的小button。 你会得到这个对话框:
外键约束personal/external/stackoverflow/sql-fk.png
订单表应该已经被选中了。 select左侧下拉菜单中的客户表。 然后在左侧的网格中selectID
列。 在右侧的网格中,selectCustomerID
列。 closures对话框,然后closures。 按下Ctrl + S保存。
拥有这个约束将确保在没有伴随的客户logging的情况下不存在订单logging。
要像这样有效地查询数据库,您可能需要阅读JOIN 。
这是我通常如何做(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.
正如你所看到的第二次插入细节失败,因为外键。 这是一个很好的networking链接,它显示了在表创build或之后定义FK的各种语法。
如果你说的是两种情况,比如说老师和学生,你可以创build两个表格,第三个表格存储关系。 这第三个表格可以有两列,比如teacherID和StudentId。 如果这不是你要找的,请详细说明你的问题。
如果你不使用SSMS,那么这里是语法:
ALTER TABLE <table_name> ADD <constraint_name> FOREIGN KEY (<column_name1> , <column_name2> ) REFERENCES <table_name> (<column_name1> , <column_name2>)