34,576
社区成员
发帖
与我相关
我的任务
分享
ALTER COLUMN column_name
{
[ type_schema_name. ] type_name [ ( { precision [ , scale ]
| max | xml_schema_collection } ) ]
[ COLLATE collation_name ]
[ SPARSE | NULL | NOT NULL ]
| {ADD | DROP }
{ ROWGUIDCOL | PERSISTED | NOT FOR REPLICATION | SPARSE }
}
| [ WITH { CHECK | NOCHECK } ]
---try
CHECK 约束不接受计算结果为 FALSE 的值。因为空值的计算结果为 UNKNOWN,所以表达式中存在这些值可能会覆盖约束。例如,假设对 int 列 MyColumn 应用一个约束,指定 MyColumn 只能包含值 10(即 MyColumn = 10)。如果将值 NULL 插入到 MyColumn,SQL Server 2005 数据库引擎 将插入 NULL 且不返回错误。
如果 CHECK 约束检查的条件对于表中的任何行都不是 FALSE,它将返回 TRUE。如果刚创建的表没有任何行,则此表的任何 CHECK 约束都视为有效。这种情况可能会产生意外结果,如下面的示例所示。
复制代码
CREATE TABLE CheckTbl (col1 int, col2 int);
GO
CREATE FUNCTION CheckFnctn()
RETURNS int
AS
BEGIN
DECLARE @retval int
SELECT @retval = COUNT(*) FROM CheckTbl
RETURN @retval
END;
GO
ALTER TABLE CheckTbl
ADD CONSTRAINT chkRowCount CHECK (dbo.CheckFnctn() >= 1 );
GO
添加的 CHECK 约束指定表 CheckTbl 必须至少包含一行。但是,因为表中不包含任何可供检查此约束的条件的行,所以 ALTER TABLE 语句将成功。
执行 DELETE 语句时不验证 CHECK 约束。因此,使用特定类型的 CHECK 约束对表执行 DELETE 语句时可能会产生意外结果。例如,假设对表 CheckTbl 执行下列语句。
复制代码
INSERT INTO CheckTbl VALUES (10, 10)
GO
DELETE CheckTbl WHERE col1 = 10;
即使 CHECK 约束指定表 CheckTbl 必须至少包含 1 行,DELETE 语句也会成功。
ALTER TABLE 订购单明细 alter column 数量 tinyint check (数量 between 0 and 1000) default not null)
create table tb(i int)
insert into tb select 5
insert into tb select 20
--失败
alter table tb add constraint con_check check (i>10)
--成功,不验证现有数据
alter table tb with nocheck add constraint con_check check (i>10)
保证插入数据的有效性和完整性。
比如性别列,只能是“男”“女”,
输入“abc”就是无效的,所以你可以添加约束
alter table 表名
add constraint chk_sex check(性别 in ('男','女'))进行约束
create table tb(id int)
go
ALTER TABLE tb ADD CONSTRAINT exd_check CHECK (id > 10)
INSERT INTO TB VALUES(100)
INSERT INTO TB VALUES(9)
--这个会报错 服务器: 消息 547,级别 16,状态 1,行 1
INSERT 语句与 COLUMN CHECK 约束 'exd_check' 冲突。该冲突发生于数据库 'master',表 'tb', column 'id'。
语句已终止。