2016-11-25 52 views
1

我在SQL中颇为新颖,想要寻求帮助,因为我正在努力解决外键问题。我一直在搜索和谷歌搜索几天没有结果。SQL外键返回NULL

我的问题是我创建了2个表,其中一个是主键,另一个是主键和外键。你可以看到下面的示例代码:

CREATE TABLE CarList 
(
    C_Id int IDENTITY (1,1) PRIMARY KEY, 
    Car_Model nvarchar(255), 
) 

比我插入数据到这个表如下图所示:

INSERT INTO CarList (Car_Model) 
VALUES ('AUDI'), ('BMW'), ('PORSCHE') 

比我创建与外键的第二个表,如下图所示:

CREATE TABLE Series 
(
    S_Id int IDENTITY (1,1) PRIMARY KEY, 
    Car_Series nvarchar(255), 
    Car_Id int FOREIGN KEY REFERENCES CarList(C_Id) 
) 

而作为最后一步,我插入第二个表格的数据:

INSERT INTO Series(Car_Series) 
VALUES ('911c'), ('330d'), ('80TDI') 

这里我的问题实际上来了。一旦我全部设置并用外键调用表格,应该具有外键值的列显示为NULL。我已经完成了SQL Server Management Studio中两个表之间的关系,但结果仍然相同。

然后,我试图用连接映射两个表,并仍然相同。我在互联网上阅读的所有内容基本上都没有说明值应该如何显示在外键列中,或者至少我没有明白这一点。我希望第一台桌上汽车模型对应第二张桌子上的ID号。所以如果我想从AUDI的第一个表中调用ID 1来获得第二个表80TDI系列的ID。

你能帮忙吗?

回答

2

你需要插入值外键填充系列表时,例如:

INSERT INTO Series(Car_Series) 
VALUES 
('911c', 3), 
('330d', 2), 
('80TDI', 1) 

至于我可以看到你的外国(我不是汽车大!)关键点指向汽车(如奥迪,宝马)的制造商。当你将数据添加到系列 Sql Server不知道制造商(它对我的汽车知之甚少!),所以你必须告诉它。

外键约束只是意味着SQL不会,说你键添加一个高尔夫球如下:

INSERT INTO Series(Car_Series) 
VALUES 
('Golf', 4) 

,除非你已经设置了大众与4在*CarList*表中的关键字。

顺便提一下,您可以将外键列设置为不允许空值 - 如果您希望确保其所有条目都引用父表,那么这是一种很好的做法。

+0

谢谢你马克!现在很清楚。唯一出现在我脑海的是 - 如果我有非常大量的数据插入到第二个表中,该怎么办?不会添加相应的数字需要太多时间?有没有可能为此自动选择,或者我必须采用这种方法? – TheShadow

+0

不,它不应该明显增加开销,只要它在相同的插入语句中。数据量也很低,因为它只是一个整数。 –

+0

再次感谢你马克!现在很清楚:) – TheShadow

1
you need to insert data in foreign key when populating the Series table 

    CREATE TABLE CarList 
(
C_Id int IDENTITY (1,1) PRIMARY KEY, 
Car_Model nvarchar(255), 
) 

INSERT INTO CarList (Car_Model) 
VALUES 
('AUDI'), 
('BMW'), 
('PORSCHE') 

CREATE TABLE Series 
(
S_Id int IDENTITY (1,1) PRIMARY KEY, 
Car_Series nvarchar(255), 
Car_Id int FOREIGN KEY REFERENCES CarList(C_Id) 
) 

INSERT INTO Series(Car_Series,Car_Id) 
VALUES 
('911c', 3), 
('330d', 2), 
('80TDI', 1) 

select * from CarList a join Series b on a.C_Id=b.Car_Id 
where C_Id=1 

输出

C_Id Car_Model S_Id Car_Series Car_Id 
1   AUDI  3  80TDI  1 
+0

谢谢Chanukya! – TheShadow