首页 > 解决方案 > Sql,使用由多列组成的主键创建表的外键

问题描述

我有下表:

CREATE TABLE Appartment
(
    SizeSquareMeter INT,
    Type VARCHAR(30) NOT NULL,
    StreetName VARCHAR(30) NOT NULL,
    Number INT NOT NULL,
    Door INT  NOT NULL,

    CONSTRAINT App_Address PRIMARY KEY(StreetName, Number, Door)
)

我还需要创建下表

CREATE TABLE Resident
(
    RID INT PRIMARY KEY NOT NULL,
    FirstName VARCHAR(30) NOT NULL,
    LastName VARCHAR(30) NOT NULL,
    BirthDate DATE NOT NULL,
    StreetName VARCHAR(30) NOT NULL,
    Number INT NOT NULL,
    Door INT NOT NULL,

    CONSTRAINT Resident_Address 
        FOREIGN KEY (StreetName, Number, Door) REFERENCES Appartment(StreetName, Number, Door)
)

现在上面的方法有效,但它复制了地址,我不希望这样,有没有一种方法可以在不复制地址的情况下创建一个外键,Resident而不Appartment 需要创建一个新的主键 Appartment

注意:不管它是否重要,它基本上应该是有效的 Microsoft DDL。

标签: sqlsql-server

解决方案


您只能使用特定的 Id 来做外键。它打破了规范化规则(当您在两个表中使用相同的详细信息时)。基本上,您可以在 Appartment 表上创建一个 UniqueId。从已经在 Appartment 表中注册的 Resident 表中删除 StreetName、Number 和 Door。使用外键将 AppartmentId 添加到 Resident。这是更新的创建示例:

CREATE TABLE Appartment(
    ApartmentId INT NOT NULL ,
    SizeSquareMeter int,
    Type varchar(30) NOT NULL,
    StreetName varchar(30) NOT NULL,
    Number int NOT NULL,
    Door int NOT NULL,
    CONSTRAINT PK_Appartment PRIMARY KEY(ApartmentId)
)


CREATE TABLE Resident(
    RID int PRIMARY KEY NOT NULL,
    AppartmentId INT NOT NULL,
    FirstName varchar(30) NOT NULL,
    LastName varchar(30) NOT NULL,
    BirthDate Date NOT NULL,
    CONSTRAINT FK_Resident_Address FOREIGN KEY (AppartmentId) REFERENCES Appartment
)

推荐阅读