首页 > 解决方案 > SqlException:INSERT 语句与 FOREIGN KEY 约束“FK_Register_Event”冲突

问题描述

我在 SQL Server 中有三个表;

事件表:

CREATE TABLE [dbo].[Event] 
(
    [EventName]   VARCHAR(25) NOT NULL,
    [Description] VARCHAR(60) NULL,
    [Location]    VARCHAR(20) NULL,
    [Date]        VARCHAR(10) NULL,
    [TicketFee]   FLOAT(53)   NULL,
    PRIMARY KEY CLUSTERED ([EventName] ASC)
);

客户

CREATE TABLE [dbo].[Client] 
(
    [Email]    VARCHAR(35) NOT NULL,
    [FullName] VARCHAR(25) NULL,
    [Address]  VARCHAR(50) NULL,
    [Age]      INT          NULL,
    [Phone]    VARCHAR(15) NULL,
    PRIMARY KEY CLUSTERED ([Email] ASC)
);

注册

CREATE TABLE [dbo].[Register] 
(
    [Id]            INT         NOT NULL,
    [GuestNum]      INT         NULL,
    [PaymentAmount] FLOAT(53)   NULL,
    [EventName]     VARCHAR(25) NULL,
    [Email]         VARCHAR(35) NULL,

    PRIMARY KEY CLUSTERED ([Id] ASC),
    CONSTRAINT [FK_Register_Client] 
         FOREIGN KEY ([Email]) REFERENCES [dbo].[Client] ([Email]),
    CONSTRAINT [FK_Register_Event] 
         FOREIGN KEY ([EventName]) REFERENCES [dbo].[Event] ([EventName])
);

Event表由仅用于搜索功能的虚拟数据组成,当用户尝试注册新事件时,它存储在注册表中。

麻烦的是我收到一个错误:

SqlException:INSERT 语句与 FOREIGN KEY 约束“FK_Register_Event”冲突。冲突发生在数据库“C:\USERS\RHYME\SOURCE\REPOS\ONLINEEVENTREGISTRATION\ONLINEEVENTREGISTRATION\APP_DATA\DATABASE1.MDF”,表“dbo.Event”,列“EventName”中。

我在互联网上搜索并了解到这是因为我试图在外键列中插入一条外键列中不存在的值的记录。但是,即使我尝试使用EventName事件表中不存在的不同事件注册一个事件,它仍然会引发相同的错误。

我真的很困惑我的表在哪里导致了问题......我是数据库新手,任何帮助将不胜感激。

标签: sqlsql-serverasp.net-mvc

解决方案


Event表由仅用于搜索功能的虚拟数据组成,当用户尝试注册新事件时,它存储在注册表中。

根据表设计,这不是该数据库的预期使用方式。应该在Event表中定义事件,因为该表是为保存“事件”实体的属性(列)而构建的。

Client表包含有关注册参加活动的人员的属性。

Register表定义了“客户端”和“事件”之间的多对多关系。一位客户可能会参加许多活动。一个事件可能有许多客户参加。

Register和之间的外键关系Event意味着EventName必须在Event表中定义好后才能插入Register表中。

如果您打算保留此数据模型,则必须在为事件Event创建注册之前调整您的代码以在表中创建一个事件。如果您打算使用上面描述的表(通过注册创建事件),那么您需要一个新的数据模型。


推荐阅读