sql - 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。
解决方案
您只能使用特定的 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
)
推荐阅读
- javascript - 如何在javascript中设置元素id?
- postgresql - 使用另一个表中的值更新行时出现 Postgres 错误
- android - 颤振应用程序中的“setState() 或 MarkNeedsBuild() 期间调用”错误
- python - 在 Python 上按时间顺序发送 midi 消息
- php - 条带令牌警告消息
- r - 如何使用ggplot将日期放在x轴上?
- python - 检查范围的长度除以范围元素是否没有除余
- c - 使用C中的递归从txt文件反向打印
- concatenation - DAX Concatenate 不适用于文本字段
- r - 在 r 中创建动态报价值