添加作为参考表主键一部分的外键?

时间:2018-04-01 18:53:29

标签: sql sql-server

当引用表中的主键是两个字段时,如何添加外键。 在讲师给出的ERD图中,它表明表产品中的两个字段(制造商和模型)都充当主键。 另一方面,在DSD图中,它显示表“PC”中的字段模型是该表的主键,也是从表产品引用字段模型的外键。

当尝试在SQL Server中执行以下代码时,会出现错误:

  

消息1774,级别16,状态0,行10列中的列数   引用外键'FK__PC__model__66603565'的列列表   与引用的表'Product'中的主键不匹配。   消息1750,级别16,状态1,行10无法创建约束或   指数。查看以前的错误。

create table Product(
maker nvarchar(50) not null , 
model int not null ,
type nvarchar(50) not null,
CONSTRAINT PK_MAKER_MODEL PRIMARY KEY (maker,model),
CONSTRAINT CH_TYPE  check(type in ('PC','LAPTOP','PRINTER'))
)

-------------------------------------------------------------
create table PC(
model int not null ,
speed nvarchar(50),
ram nvarchar(50),
hd nvarchar(50),
price dec(12,2),
FOREIGN KEY ( model) REFERENCES Product
ON DELETE NO ACTION
)

DSD DIAGRAM ERD DIAGRAM

1 个答案:

答案 0 :(得分:1)

你不明白外键是如何工作的。他们需要引用整个主键。出于这个原因,我更喜欢单列外键。更像是这样:

create table Products (
    productId int identity(1, 1) primary key,
    maker nvarchar(50) not null, 
    model int not null,
    type nvarchar(50) not null,
    constraint unq_products_maker_model unique (maker, model),
    constraint chk_products_typecheck (type in ('PC', 'LAPTOP', 'PRINTER'))
);

create table PC (
    pcId int identity(1, 1) primary key,
    productId int not null,
    speed nvarchar(50),
    ram nvarchar(50),
    hd nvarchar(50),
    price dec(12,2),
    foreign key (productId) references Products(productId) on delete no action
);