2016-02-05 1046 views
0

我对SQL很陌生,目前正在使用MS SQL Server Management Studio。我得到了一份任务,我必须在其中创建一个包含特定表的数据库。其中两个表被命名为“产品”和“类别”。创建完所有的表后,我必须填充它们(在它们中插入记录),它就在这里,我卡住了。SQL:INSERT语句与FOREIGN KEY约束冲突

这是创建两个表的代码:

分类表:

CREATE TABLE Categories (
    CategoryID NCHAR(3) PRIMARY KEY, 
    Name NVARCHAR(50) NOT NULL); 

产品表:

CREATE TABLE Products (
    ProductID INT identity(1,1) PRIMARY KEY, 
    Name NVARCHAR(50) NOT NULL, 
    [Single Price] MONEY NOT NULL, 
    CategoryID NCHAR(3) NOT NULL, 
    FOREIGN KEY (CategoryID) REFERENCES Categories(CategoryID)); 

在这里,我将数据插入到类别表:

INSERT INTO Categories (CategoryID, Name) 
VALUES ('BKS', 'Books'), 
     ('MSC','Music'), 
     ('HDW', 'Hardware'), 
     ('SFW', 'Software'); 

到目前为止这么好。这就是问题出现的地方! 我试图将数据插入到Products表是这样的:

INSERT INTO Products (Name, [Single Price], CategoryID) 
VALUES ('SQL for Dummies', 39.99, 'BKS'), 
     ('The Power of Now', 24.99, 'BKS'), 
     ('Steve Jobs: The Book', 29.99, 'BKS'), 
     ('Eminem albums', 19.99, 'MSC'), 
     ('Jay Z albums', 23.99, 'MSC'), 
     ('Notorious B.I.G. albums', 24.99, 'MSC'), 
     ('GeForce GT 710 2GB graphics card', 49.99, 'HDW'), 
     ('2 TB T3 SSD', 79.99, 'HDW'), 
     ('Acer Curved Gaming monitor', 259.99, 'HDW'), 
     ('MS SQL Server Management Studio', 59.99, 'STW'), 
     ('Visual Studio 2015', 69.99, 'SFW'), 
     ('GTA V', 79.99, 'SFW'); 

而且我得到以下错误:

INSERT语句冲突与外键约束‘FK__Products__Catego__99BF96C4’的冲突。发生在数据库“HackCompany”,表“dbo.Categories”,列'CategoryID'

该声明已被终止。

如果有人有任何帮助提供,一切将不胜感激!

+3

的一个或多个类别的存在是不是在类别表。对于您的示例数据,这将是“STW”。 –

+0

噢,该死!非常感谢,我不敢相信我没有看到这个!肯定解决了问题:) –

回答

1

问题是一个或多个类别不在数据中。你可以用select声明找到这个:

SELECT v.* 
FROM (VALUES ('SQL for Dummies', 39.99, 'BKS'), 
      ('The Power of Now', 24.99, 'BKS'), 
      ('Steve Jobs: The Book', 29.99, 'BKS'), 
      ('Eminem albums', 19.99, 'MSC'), 
      ('Jay Z albums', 23.99, 'MSC'), 
      ('Notorious B.I.G. albums', 24.99, 'MSC'), 
      ('GeForce GT 710 2GB graphics card', 49.99, 'HDW'), 
      ('2 TB T3 SSD', 79.99, 'HDW'), 
      ('Acer Curved Gaming monitor', 259.99, 'HDW'), 
      ('MS SQL Server Management Studio', 59.99, 'STW'), 
      ('Visual Studio 2015', 69.99, 'SFW'), 
      ('GTA V', 79.99, 'SFW') 
    ) as v(Name, [Single Price], CategoryID) 
WHERE NOT EXISTS (select 1 from categories c where v.categoryID = c.categoryID) 
+0

哇,这是一个非常干净的方式来找到有问题的条目。谢谢! –

0

类别“STW”不表

+0

绝对是这个问题,谢谢! –

相关问题