当前位置: 首页 > 图文教程 > 数据库 > MSSQL > 确保所有的非空(Non-NULL)值都是唯一的

MSSQL
SQLServer中求两个字符串的交集
SQL Server 触发器 表的特定字段更新时,触发Update触发器
SQL 查询分析中使用net命令问题
SQLServer 批量导入目录文件
sql语言中delete删除命令语句详解
Linq to SQL 插入数据时的一个问题
一个简单的SQL 行列转换语句
SQLServer 常用语句(按功能分)
SQLServer 管理常用SQL语句
SQL Server 2000中的触发器使用
SQL小技巧 又快又简单的得到你的数据库每个表的记录数
Sql Server 2000删除数据库备份文件
批量更新数据库所有表中字段的内容,中木马后的急救处理
sqlserver 通用分页存储过程
远程连接局域网内的sql server 无法连接 错误与解决方法
目前用到的两个分页存储过程代码
sqlserver 多表关联时在where语句中慎用trim()方法
Sql2005注射辅助脚本[粗糙版]
sql 2005不允许进行远程连接可能会导致此失败的解决方法
MSSQL2005数据库备份导入MSSQL2000

MSSQL 中的 确保所有的非空(Non-NULL)值都是唯一的


出处:互联网   整理: 软晨网(RuanChen.com)   发布: 2009-10-30   浏览: 158 ::
收藏到网摘: n/a

 

问:我的SQL Server表的一列允许NULL值。我希望在其值为非NULL时,该列是唯一的。怎样才能以编程的方式实现这一行为?如果在该列上设置一个UNIQUE 约束,我只能包含一个值为NULL的记录。我正在使用触发器实现这一约束,您可以推荐一个更简单的方法以保证所有的非NULL值唯一吗?

答:SQL Server没有实现非NULL值唯一性的内建机制,因此您需要通过自定义的CHECK约束来实现这一机制。例如,以下一段编码实现了您所需要的功能:

USE tempdb
CREATE table t1 (c1 int NULL, c2 char(5) NULL)
CREATE trigger mytrigger on t1 for insert, update as
BEGIN
       IF (select max(cnt) from (select count(i.c1)
as cnt from t1, inserted i where t1.c1=i.c1 group
by i.c1) x) > 1
       ROLLBACK TRAN
END

在SQL Server 2000中,您还可以使用INSTEAD OF触发器来实现这一功能。有关INSTEAD OF触发器的详细信息,请参阅以下文章。如需访问这些文章,请访问SQL Server 杂志网站,在InstantDoc框中输入InstantDoc号,然后点击Go。相关文章如下:

Tricks with INSTEAD OF Triggers; InstantDoc number 15828
INSTEAD OF Triggers on Views; InstantDoc number 15791
INSTEAD OF Triggers; InstantDoc number 15524

—SQL Server MVPs