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
显然,您的插入操作违反了检查约束。这是数据库中的一个约束,执行特定的检查 - 数字值在特定范围内,字符串最多为n个字符或其他任何值。
要找出检查约束是什么,试试这个:
SELECT
name, definition
FROM
sys.check_constraints
WHERE
name = 'ck_str_member_no'
这会给你是在“定义”列正在检查的表达。
从这个表达式,你应该能够确定你的插入被拒绝的原因。解决问题并再次插入。
如果你真的不能修复你的数据,如果你并不需要/想在地方,检查约束,你可以将它:
ALTER TABLE dbo.Members
DROP CONSTRAINT ck_str_member_no
马克
谢谢..这是非常有用的:)我不知道为什么我正在寻找的约束不显示在同一张表中,但至少当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;问题可能就在那里,在一个字段值是“坏”。
@mjv我dint得到你 – Anuya 2009-09-30 04:03:32
请把你创建表的脚本和Insert语句还那么它将更容易理解.. – 2009-09-30 04:00:01
你是否应用了像str_member_no的唯一主键? – 2009-09-30 04:15:16