SQL Server使用外键创建表

时间:2013-04-10 22:26:13

标签: sql sql-server sql-server-2008

我想验证表中对外键的正确处理。这是我在下面创建的两个表。一个人可能没有列出地址,所以我希望它为空。否则我想引用地址表中的主键并将其作为外键存储在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,
)

同样Q2我从未使用过触发器,但我假设处理插入的方法是先使用存储过程插入地址,获取主键,然后将其传递给存储过程以插入到Person中表

2 个答案:

答案 0 :(得分:4)

问题:是否有可能不止一个人住在同一地址?此外,一个人可能住在一个以上的地址吗?

如果是这种情况,请考虑M:N与其他PersonAddress表的关系。

否则,如果不是这种情况,我会问自己“如果没有这个人,你是否更可能没有地址或地址?”目标是确定你是否应该使用Person表或PersonID存储AddressID用地址表?

答案 1 :(得分:1)

我会像这样更改地址:

 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

然后在Insert表中使用t-sql变量@AddressId的值。您仍然可以在其他SQL语句中使用AddressId进行连接,但是您在City,Zip和Street地址上有一个主键,可以防止您在Address表中插入重复的地址。将此设为 clustered 索引,以防您需要检索或处理一个邮编或一个城市中的所有地址组...