2010-02-17 192 views
3

我有一个包含两个链接列的表,一个强制布尔值和一个可选日期。布尔值为FALSE时只能有一个日期。所以我有这样的结构:更新时的约束违规

CREATE TABLE FOO (
    FOO_ID INT IDENTITY(1, 1) NOT NULL, 
    MY_DATE DATETIME, 
    MY_BOOLEAN BIT DEFAULT 0 NOT NULL, 

    CONSTRAINT FOO_PK PRIMARY KEY (FOO_ID) 
); 

而且我已经写了这个限制,以保持数据的完整性:

ALTER TABLE FOO 
ADD CONSTRAINT FOO_CHK CHECK (
    MY_BOOLEAN=0 OR MY_DATE IS NULL 
); 

我必须失去了一些东西很明显,但事实是,我无法运行此更新查询:

UPDATE FOO 
SET 
    MY_BOOLEAN=1, 
    MY_DATE=NULL 
WHERE FOO_ID=31416 

我得到一个检查约束冲突错误,更新失败。我究竟做错了什么?


UPDATE

很遗憾地告诉我已经输错列名...对不起,浪费你的时间。我希望我能删除的问题:_(

+0

错误应该告诉**哪个**约束失败,是否说'FOO_CHK'是原因? –

+0

InstrucciónUPDATE en contrto con lalaracciónCHECK“FOO_CHK”。El conflicto ha_aparecido en la base de datos“MY_DATABASE”,tabla“dbo.FOO”。 –

回答

0

对不起,虚假的问题(自回答似乎让?是唯一的方法来关闭它)

2

我用这个脚本测试这一点,并没有错误是否有任何其他约束

CREATE TABLE FOO (
    FOO_ID INT IDENTITY(1, 1) NOT NULL, 
    MY_DATE DATETIME, 
    MY_BOOLEAN BIT DEFAULT 0 NOT NULL, 

    CONSTRAINT FOO_PK PRIMARY KEY (FOO_ID) 
); 
ALTER TABLE FOO 
ADD CONSTRAINT FOO_CHK CHECK (
    MY_BOOLEAN=0 OR MY_DATE IS NULL 
); 

set identity_insert foo on 
insert into foo(FOO_ID, my_date, MY_BOOLEAN) 
select 31416, '20090101', 0 
set identity_insert foo off 

UPDATE FOO 
SET 
    MY_BOOLEAN=1, 
    MY_DATE=NULL 
WHERE FOO_ID=31416 
+0

+1,并验证CHECK的工作原理:'更新FOO设置MY_BOOLEAN = 1,MY_DATE = getdate()WHER E FOO_ID = 31416' –

+0

你说得对,它只适用于这两列......还有一些其他的限制,但它们都不影响布尔和日期,而且错误信息非常明确:它责怪这个具体约束: - ? –

+0

请提供全部表格创建脚本以及所有(检查)约束 – edosoft