INSERT与查找表的外键约束冲突

时间:2017-06-10 21:25:37

标签: sql sql-server

好吧,我有这两张桌子:

CREATE TABLE [dbo].[Card] 
(
    [CardID] INT IDENTITY (1, 1) NOT NULL,
    ...
    PRIMARY KEY CLUSTERED ([CardID] ASC)
);

CREATE TABLE [dbo].[Deck] 
(
    [DeckID] INT IDENTITY (1, 1) NOT NULL,
    [Name]   VARCHAR (50)  NOT NULL,
    [Class]  VARCHAR (25)  NOT NULL,
    [Guide]  VARCHAR (MAX) NOT NULL,
    PRIMARY KEY CLUSTERED ([DeckID] ASC)
);

这个想法是有人可以使用Card表中的记录构建自己的套牌。对于这个功能,我写了一个查找表脚本:

CREATE TABLE [dbo].[DeckCard] 
(
    [DeckID] INT NOT NULL,
    [CardID] INT NOT NULL,
    [Count]  INT NOT NULL,

    PRIMARY KEY CLUSTERED ([DeckID] ASC, [CardID] ASC),

    FOREIGN KEY ([DeckID]) REFERENCES [dbo].[Deck] ([DeckID]),
    FOREIGN KEY ([CardID]) REFERENCES [dbo].[Card] ([CardID])
);

我刚注意到并改变为对SQLException没有影响的东西是DeckCard表中的PRIMARY KEY定义(我根据查找表示例定义了这个定义)。但无论如何这是我得到的错误,我根本不理解与关键语句的冲突,因为我有外键的引用主键。任何SQL教程中的任何内容都不会让我相信这不是确切的方法,所以我认为这与VS本身有关吗? (再次删除查找表定义中的PRIMARY KEY行不会改变任何内容)。

我得到的错误是:

  

System.Data.SqlClient.SqlException:
  INSERT语句与FOREIGN KEY约束“FK__DeckCard__DeckID__48CFD27E”冲突。冲突发生在数据库“TheMorningStar”,表“dbo.Deck”,列'DeckID'

2 个答案:

答案 0 :(得分:1)

如果要将数据插入[DeckCard]表,首先必须插入[Card]和[Deck]表。

插入[Card]和[Deck]表后,您将获得CardID和DeckID用于插入[DeckCard]表。

因为CardID和DeckID是IDENTITY列,所以你想获得CardID和DeckID,那么你使用SELECT @@ IDENTITY。

例)

DECLARE @CardID INT, @DeckID INT;

INSERT INTO [dbo].[Card]([Name]) VALUES('Name');
SET @CardID = @@IDENTITY;

INSERT INTO [dbo].[Deck]([Name],[Class],[Guide]) VALUES('Name','Class','Guide');
SET @DeckID = @@IDENTITY;

INSERT INTO [dbo].[DeckCard]([CardID],[DeckID],[Count]) VALUES(@CardID,@DeckID,0);

我希望它会对你有所帮助。

答案 1 :(得分:0)

由于某些特定情况,可能会出现此问题

  1. 关系表不一致(表示在参考表中插入时可能存在不一致的数据插入)。要解决首先插入Card和Deck表数据,然后必须将主键数据插入DeckCard表。如果您尝试插入第一个Deckard表,则可能是错误或不一致的数据入口不属于其他表抛出错误。

    2.从您的错误消息dbo.Deck",列' DeckID未包含或不匹配。 !!!

  2. 我认为答案会有所帮助。