use*_*932 166 sql database sql-server
我在尝试向tblDomare表中添加外键时遇到问题; 我在这做错了什么?
CREATE TABLE tblDomare
(PersNR VARCHAR (15) NOT NULL,
fNamn VARCHAR (15) NOT NULL,
eNamn VARCHAR (20) NOT NULL,
Erfarenhet VARCHAR (5),
PRIMARY KEY (PersNR));
INSERT INTO tblDomare (PersNR,fNamn,eNamn,Erfarenhet)
Values (6811034679,'Bengt','Carlberg',10);
INSERT INTO tblDomare (PersNR,fNamn,eNamn,Erfarenhet)
Values (7606091347,'Josefin','Backman',4);
INSERT INTO tblDomare (PersNR,fNamn,eNamn,Erfarenhet)
Values (8508284163,'Johanna','Backman',1);
CREATE TABLE tblBana
(BanNR VARCHAR (15) NOT NULL,
PRIMARY KEY (BanNR));
INSERT INTO tblBana (BanNR)
Values (1);
INSERT INTO tblBana (BanNR)
Values (2);
INSERT INTO tblBana (BanNR)
Values (3);
ALTER TABLE tblDomare
ADD FOREIGN KEY (PersNR)
REFERENCES tblBana(BanNR);
Run Code Online (Sandbox Code Playgroud)
错误信息:
ALTER TABLE语句与FOREIGN KEY约束"FK_ tblDomare _PersN__5F7E2DAC" 冲突.冲突发生在数据库"almu0004",表"dbo.tblBana",列'BanNR'中.
Smu*_*tje 306
它的发生是因为你试图创建一个外键tblDomare.PersNR来tblBana.BanNR,但/和值tblDomare.PersNR没有任何的价值相匹配tblBana.BanNR.您无法创建违反参照完整性的关系.
dan*_*y89 32
这个查询对我来说非常有用.它显示所有没有任何匹配的值
select FK_column from FK_table
WHERE FK_column NOT IN
(SELECT PK_column from PK_table)
Run Code Online (Sandbox Code Playgroud)
Ank*_*was 27
可以使用ALTER TABLE tablename WITH NOCHECK ...创建外键,这将允许违反外键的数据.
"ALTER TABLE tablename WITH NOCHECK ..."选项添加FK - 此解决方案适用于我.
Gir*_*buC 10
在将外键添加到表之前,请执行以下操作
如果表中包含不进行设计和更改,请手动执行.
alter table表1添加外键(Column Name)引用表2(列名)
alter table表1 alter column Column Name属性不为null
我猜,外键表中的列值应该与主键表的列值匹配.如果我们试图在两个表之间创建一个外键约束,其中一列(将成为外键)中的值与主键表的列值不同,那么它将抛出该消息.
因此,始终建议仅在"外键"列中插入主键表列中存在的那些值.
对于前者 如果主表列具有值1,2,3,并且在外键列中插入的值不同,则不会执行查询,因为它期望值在1和3之间.
当您在表 B 中定义引用表 A 主键的外键时,这意味着当一个值在 B 中时,它必须在 A 中。这是为了防止对表进行不一致的修改。
在您的示例中,您的表包含:
tblDomare 与PRIMARY KEY (PersNR):
PersNR |fNamn |eNamn |Erfarenhet
-----------|----------|-----------|----------
6811034679 |'Bengt' |'Carlberg' |10
7606091347 |'Josefin' |'Backman' |4
8508284163 |'Johanna' |'Backman' |1
---------------------------------------------
Run Code Online (Sandbox Code Playgroud)
tblBana:
BanNR
-----
1
2
3
-----
Run Code Online (Sandbox Code Playgroud)
这个说法:
ALTER TABLE tblDomare
ADD FOREIGN KEY (PersNR)
REFERENCES tblBana(BanNR);
Run Code Online (Sandbox Code Playgroud)
说任何行中tblDomare的 keyPersNR必须tblBana在 key 上的table 中有对应关系BanNR。您的错误是因为您插入了行tblDomare而tblBana.
2 解决您的问题的解决方案:
tblBana在 (6811034679, 7606091347, 8508284163) 中添加带有 BanNR 的行tblDomare其中没有对应关系的所有行tblBana(但您的表格将为空)一般建议:在填充表之前,您应该具有外键约束。外键在这里是为了防止表的用户填充不一致的表。