2009-09-30 232 views
3

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

回答

10

顯然,您的插入操作違反了檢查約束。這是數據庫中的一個約束,執行特定的檢查 - 數字值在特定範圍內,字符串最多爲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

2

顯然,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

相關問題