[英]SQL Server Create Table with Foreign Key
我想验证表中外键的正确处理。 这是我在下面创建的两个表。 一个人可能没有列出地址,所以我希望它为空。 否则,我想引用地址表中的主键并将其作为外键存储在Person表中。 我们也可能没有人而拥有一个地址对象。
一个人的表:
CREATE TABLE Person
(
PersonID int IDENTITY PRIMARY KEY,
FName varchar(50) NULL,
MI char(1) NULL,
LName varchar(50) NULL,
AddressID int FOREIGN KEY REFERENCES Address(AddressID) NULL,
)
地址表:
CREATE TABLE Address
(
AddressID int IDENTITY PRIMARY KEY,
Street varchar(60) NULL,
City varchar(50) NULL,
State varchar(2) NULL,
Zip varchar(10)NULL,
Intersection1 varchar(60) NULL,
Intersection2 varchar(60) NULL,
)
另外,第二季度我从未使用过触发器,但是我假设处理插入的方法是先使用存储过程插入地址,获取主键,然后将其传递给存储过程以插入到Person表中?
您的问题:同一个地址可能住的人不止一个? 另外,一个人可能居住在多个地址上吗?
如果是这种情况,请考虑与其他PersonAddress表建立M:N关系。
否则,如果不是这种情况,我会问自己“您是否有没有地址的人,或者没有人的地址?”的目标是确定应将AddressID与Person表一起存储还是PersonID与Address表一起存储?
我将这样更改地址:
CREATE TABLE Address
(
AddressID int IDENTITY,
Street varchar(60) NULL,
City varchar(50) NULL,
State varchar(2) NULL,
Zip varchar(10)NULL,
Intersection1 varchar(60) NULL,
Intersection2 varchar(60) NULL,
)
Alter Table Address Add Constraint
PK_Addresses Primary Key Clustered
(City Asc, Zip Asc, Street asc)
Create Unique NonClustered Index IX_Address_Key
On Address{AddressId)
我这样做是因为,然后,当您添加具有指定的StreetAddress,City和Zip的人时,可以在SavePerson
存储过程中执行此操作。
If Exists (Select * From Address
Where Street = @Street
And City = @city
And Zip = @zip)
Begin
Select @AddressId = AddressId
From Address
Where Street = @Street
And City = @city
And Zip = @zip
End
Else Begin
Insert Address(Street, City, State, Zip)
Values(@street, @city, @state, @zip)
Set @AddressId = Scope_Identity()
End
然后在“插入到人员”表中使用t-sql变量@AddressId的值。 您仍将使用AddressId进行其他SQL语句中的联接,但是您在城市,邮政编码和街道地址上具有主键,这将阻止您在地址表中插入重复的地址。 如果您可能需要检索或处理全部位于一个邮政编码中或全部位于一个城市中的地址组,请将其设为聚集索引。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.