代码之家  ›  专栏  ›  技术社区  ›  Aviel Fedida

SQL,使用由多个列组成的主键创建表的外键

  •  0
  • Aviel Fedida  · 技术社区  · 7 年前

    我有下表:

    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 不复制地址,也不为创建新的主键 设备 ?

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

    2 回复  |  直到 7 年前
        1
  •  1
  •   Gordon Linoff    7 年前

    外键引用可以是表中的任何唯一键。所以你可以这样做:

    CREATE TABLE Appartment (
        AppartmentId int identity unique not null,
        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,
        AppartmentId int not null,
    
        CONSTRAINT Resident_Address 
            FOREIGN KEY (AppartmentId) REFERENCES Appartment(AppartmentId)
    );
    

    也就是说,我强烈认为您应该更改数据结构,因此公寓表的主键是 identity 列。

        2
  •  1
  •   Zeki Gumus    7 年前

    您只能使用特定的ID来执行外键。它正在破坏规范化规则(当您在两个表中使用相同的细节时)。基本上,您可以在Appartment表上创建唯一ID。从已在Appartment表中注册的居民表中删除街道名称、编号和门。使用外键将AppartmentID添加到居民。以下是更新的创建示例:

    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
    )