SQL服务器错误:INSERT语句与CHECK约束冲突

问题描述:

INSERT语句与CHECK约束“ck_str_member_no”冲突。冲突发生在数据库“C:\ DOCUMENTS AND SETTINGS \ KARTHIKEYAN \ DESKTOP \ KOK \ DB \ INFT3009_ASS1_C3104855.MDF”,表“dbo.Members”,列'str_member_no'。 该声明已被终止。SQL服务器错误:INSERT语句与CHECK约束冲突

我在Visual Studio 2008 Express中使用.MDF文件。我如何解决它?

我的插入过程:


ALTER PROCEDURE [dbo].[AddNewAGCMember] 
    -- Add the parameters for the stored procedure here 
    @str_member_no varchar(6) = '', 
    @str_member_name varchar(50) = '', 
    @str_member_password varchar(10) = '',  
    @str_addr_apartment_no varchar(10) = NULL,  
    @str_addr_building_name varchar(50) = NULL, 
    @str_addr_street_name varchar(50) = NULL, 
    @int_postal_code int = NULL, 
    @str_country_name varchar(50) = NULL, 
    @int_contact_no int = NULL, 
    @str_email_addr varchar(100) = '',  
    @date_registration date = '' 
AS 
BEGIN 
    -- SET NOCOUNT ON added to prevent extra result sets from 
    -- interfering with SELECT statements. 
    SET NOCOUNT ON; 

    -- Insert statements for procedure here 
    INSERT INTO Members 
    (str_member_no, 
    str_member_name, 
    str_member_password, 
    str_addr_apartment_no, 
    str_addr_building_name, 
    str_addr_street_name, 
    int_postal_code, 
    str_country_name, 
    int_contact_no, 
    str_email_addr, 
    date_registration) 
    VALUES 
    (@str_member_no, 
    @str_member_name, 
    @str_member_password, 
    @str_addr_apartment_no, 
    @str_addr_building_name, 
    @str_addr_street_name, 
    @int_postal_code, 
    @str_country_name, 
    @int_contact_no, 
    @str_email_addr, 
    @date_registration); 
END 

表结构:

  • str_member_no,VARCHAR(6),未检查
  • str_member_name,VARCHAR(50),未检查
  • str_member_password,VARCHAR(10),未检查
  • str_addr_apartment_no,VARCHAR(10),经过
  • str_addr_building_name,VARCHAR(50),经过
  • str_addr_street_name,VARCHAR(50),经过
  • int_postal_code,INT,经过
  • str_country_name,VARCHAR(50),经过
  • int_contact_no,整型,经过
  • str_email_addr,VARCHAR(100),未选中
  • date_registration,日期,未选中

    Unchecked 
    
+0

请把你创建表的脚本和Insert语句还那么它将更容易理解.. – 2009-09-30 04:00:01

+0

你是否应用了像str_member_no的唯一主键? – 2009-09-30 04:15:16

显然,您的插入操作违反了检查约束。这是数据库中的一个约束,执行特定的检查 - 数字值在特定范围内,字符串最多为n个字符或其他任何值。

要找出检查约束是什么,试试这个:

SELECT 
name, definition 
FROM 
    sys.check_constraints 
WHERE 
    name = 'ck_str_member_no' 

这会给你是在“定义”列正在检查的表达。

从这个表达式,你应该能够确定你的插入被拒绝的原因。解决问题并再次插入。

如果你真的不能修复你的数据,如果你并不需要/想在地方,检查约束,你可以将它:

ALTER TABLE dbo.Members 
    DROP CONSTRAINT ck_str_member_no 

马克

+0

谢谢..这是非常有用的:)我不知道为什么我正在寻找的约束不显示在同一张表中,但至少当VS引发SQL异常我可以查看Managmeent Studio中的检查约束 – Jedidja 2009-10-15 12:48:56

显然,INSERT是提供针对SQL已指示垃圾给出的CHECK约束列 'str_member_no' 的值。检查约束只是一个条件强加于一个或多个字段值,然后才能添加或插入。例如,也许CHECK要求所有str_member_no超过1500(较低的值用于管理员......)或其他一些奇怪的“业务规则”。

通过检查或在此处发布用于基础表创建的DDL以及有问题的INSERT语句,您可以具体了解值(或检查谓词)的错误。

读的问题添加的代码中,str_member_no似乎没有被检查,那么它可能只是传递的值过长或空或其他一些通用的理由拒绝它;该错误通常会有所不同,但是由于存在检查,所显示的错误是基于[自定义]检查失败的假设。

无论如何,你应该检查什么值传递给AddNewAGCMember()StoredProcedure;问题可能就在那里,在一个字段值是“坏”。

+0

@mjv我dint得到你 – Anuya 2009-09-30 04:03:32

检查有如下的MySQL错误尚未solved-

MySQL CHECK constraint bug