外键参考问题,SQL Server

时间:2018-11-13 09:44:11

标签: sql-server ssms

我在理解如何设置外键参考方面遇到困难。我正在尝试在表Lägenheter和Arbetslista之间进行引用,以使Lägenheter中的一行属于Arbetslista中的许多行。

我创建了这样的表:

CREATE TABLE Deltagare (
Deltagarnr int PRIMARY KEY,
Namn varchar(30),
Typ varchar(30)
);

CREATE TABLE Uppgifter (
Uppgift varchar(30) PRIMARY KEY,
Typ varchar(30),
Pris money
);

CREATE TABLE Arbetslista (
Deltagarnr int not null,
Datum date not null,
Uppgift varchar(30) not null, 
Lägenhetsnr int not null,

PRIMARY KEY (Deltagarnr, Datum, Uppgift),
FOREIGN KEY (Deltagarnr) REFERENCES Deltagare(Deltagarnr),
FOREIGN KEY (Uppgift) REFERENCES Uppgifter(Uppgift)
);

然后,我将一些数据从.mdb文件导入所有三个表。 之后,我添加另一个表:

CREATE TABLE Lägenheter(
lägenhetsnummer int PRIMARY KEY,
gatuadress varchar(30),
kvadrater int
);

一切正常,直到最后一步:

ALTER TABLE Arbetslista
ADD FOREIGN KEY (Lägenhetsnr) REFERENCES Lägenheter(lägenhetsnummer)
;

我在这里收到以下错误消息: The ALTER TABLE statement conflicted with the FOREIGN KEY constraint "FK__Arbetslis__Lägen__403A8C7D". The conflict occurred in database "Hushåll", table "dbo.Lägenheter", column 'lägenhetsnummer'

此后,我还尝试从Arbetslista删除所有数据,然后再次执行提到的ALTER TABLE。它可以工作,但随后尝试重新导入数据时出现错误:

Hresult: 0x80004005 Description: "The INSERT statement conflicted with the FOREIGN KEY constraint "FK__Arbetslis__Lägen__412EB0B6". The conflict occurred in database "Hushåll", table "dbo.Lägenheter", column 'lägenhetsnummer'.". (SQL Server Import and Export Wizard)

为什么其他外键似乎都可以正常工作?

2 个答案:

答案 0 :(得分:0)

Arbetslista的字段Lägenhetsnr中的lägenhetsnummer表中没有行,Lägenheter的值不存在。您必须清理现有数据才能创建外键。

通过执行以下脚本检查数据:

select * from Arbetslista a where not exists (select * from Lägenheter l where l.lägenhetsnummer = a.Lägenhetsnr)

答案 1 :(得分:0)

将数据导入Arbetslista后,将列Lägenhetsnr初始化为某个值(例如XYZ)。 稍后,当尝试将FOREIGN KEY添加到Arbetslista时,SQL尝试满足此要求,但是它找不到主键为lägenhetsnummer = XYZ的行,该语句将被终止。 我认为最好的方法是先创建4表,然后清理数据并尝试导入。