Sql server错误:INSERT语句与CHECK约束冲突

时间:2009-09-30 03:56:33

标签: sql sql-server tsql

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

我在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,Checked
  • str_country_name,varchar(50),已选中
  • int_contact_no,int,Checked
  • str_email_addr,varchar(100),未选中
  • date_registration,日期,未选中

    Unchecked
    

3 个答案:

答案 0 :(得分:13)

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

要找出检查约束的内容,请尝试以下方法:

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

这将为您提供在“定义”列中检查的表达式。

从该表达式中,您应该能够确定拒绝插入的原因。解决问题并重新插入。

如果你真的无法修复你的数据,并且你不需要/想要那个检查约束,你可以放弃它:

ALTER TABLE dbo.Members
   DROP CONSTRAINT ck_str_member_no

马克

答案 1 :(得分:2)

显然,INSERT为列'str_member_no'提供了一个值,在指定了CHECK约束的情况下,SQL已被指示拒绝。检查约束只是在添加或插入字段之前强加于一个或多个字段值的条件。例如,CHECK可能要求所有str_member_no都超过1500(较低的值用于管理员......)或其他一些奇怪的“业务规则”。

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

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

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

答案 2 :(得分:0)

检查以下尚未解决的MySQL错误 -

MySQL CHECK constraint bug