需要帮助理解SSMS中的外键冲突

时间:2014-07-21 22:02:10

标签: sql sql-server sql-server-2008

我知道这似乎微不足道,而且有很多问题......

我有两张桌子:

Product (ProductID PK 1,1)
Product_Image (ProductID, ImageFile)

在SSMS设计模式下,我创建了一个外键关系。

Foreign Key Base Table: Product_Image
Foreign Key Columns: ProductID
Primary/Unique Key Base Table: Product
Primary/Unique Key Column: ProductID

在我的应用程序中,插入工作正常,但在编辑时,我得到了一个很好的错误:

The INSERT statement conflicted with the FOREIGN KEY constraint "FK_Product_Image_Product".
The conflict occurred in database "testdb", table "dbo.Product", column 'ProductID'.

当我的应用程序触发更新存储过程时,它会发生什么,它会根据ProductID从Product_Image表中删除所有图像,然后根据用户选择的图像将它们重新添加。

首先,它更新主表:

UPDATE Product SET.... etc.

然后删除与该产品相关的所有图像:

DELETE FROM Product_Image WHERE ProductID = @ProductID

然后,它根据分隔的字符串将它们重新添加...(' image1.jpg | image2.jpg | image3.jpg')

WHILE LEN(@Images) > 0
BEGIN
    INSERT INTO Product_Image ( ProductID, ImageFile ) VALUES ( @ProductID, LEFT(@Images, CHARINDEX('|', @Images+'|') -1) )
        SET @Images = STUFF(@Images, 1, CHARINDEX('|', @Images+'|'), '')
END

当我在表格上设置FK时,这不起作用...但是,我能够在SSMS中打开一个新的查询窗口,并从Product_Image表中删除一个插件并将其插入其中使用Product表中的现有productID。

也许我错过了一些愚蠢的话。我希望如此。

谢谢!

=======编辑========

添加更清晰的步骤......

创建两个表并将数据插入产品表后。

我右键单击Product_Image表,然后选择Design。我右键单击设计区域并选择" Relationships"。我点击"添加"然后展开表格和列,然后点击小" ..."按钮使用界面来做到这一点。对于主键表,我找到"产品"表并选择Column的ProductID。外键表我从Product_Image表中选择ProductID ...然后我保存了表。

因此,当通过应用程序编辑产品时,它使用存储过程来更新数据。

当它到达图像时,它会尝试从Product_Image表中删除与ProductID关联的所有图像。然后它插入它们,如上所示...如果我在SSMS中打开一个查询窗口并输入:

DELETE FROM Product_Image WHERE ProductID = 10
INSERT INTO Product_Image ( ProductID, ImageFile ) VALUES ( 10, 'test.jpg' )

它有效......

0 个答案:

没有答案