精华内容
下载资源
问答
  • CREATE UNIQUE NONCLUSTERED INDEX idx_yourcolumn_notnull ON YourTable(yourcolumn) WHERE yourcolumn IS NOT NULL;

    CREATE UNIQUE NONCLUSTERED INDEX idx_yourcolumn_notnull
    ON YourTable(yourcolumn)
    WHERE yourcolumn IS NOT NULL;

    展开全文
  • SQL Server 2008 +You can create a unique index that accept multiple NULLs with a WHERE clause. See the answer below.What you're looking for is indeed part of the ANSI standards SQL:92, SQL:1999 and...

    SQL Server 2008 +

    You can create a unique index that accept multiple NULLs with a WHERE clause. See the answer below.

    What you're looking for is indeed part of the ANSI standards SQL:92, SQL:1999 and SQL:2003, ie a UNIQUE constraint must disallow duplicate non-NULL values but accept multiple NULL values.

    In the Microsoft world of SQL Server however, a single NULL is allowed but multiple NULLs are not...

    In SQL Server 2008, you can define a unique filtered index based on a predicate that excludes NULLs:

    CREATE UNIQUE NONCLUSTERED INDEX idx_yourcolumn_notnull
    ON YourTable(yourcolumn)
    WHERE yourcolumn IS NOT NULL;

    In earlier versions, you can resort to VIEWS with a NOT NULL predicate to enforce the constraint.


    Prior to SQL Server 2008

    You cannot create a UNIQUE constraint and allow NULLs. You need set a default value of NEWID().

    Update the existing values to NEWID() where NULL before creating the UNIQUE constraint.


    对于2008之前版本sqlserver,建议采用下面方案:

    原文地址:https://www.databasejournal.com/features/mssql/article.php/3711501/UNIQUE-Column-with-multiple-NULL-values.htm

    UNIQUE Column with multiple NULL values

    By Muthusamy Anantha Kumar aka The MAK

    As you know, when you create a UNIQUE constraint on a nullable column, SQL Server allows only one NULL value, thereby maintaining the UNIQUEness. However, there are situations when we need more than one NULL value in the column but still have to maintain uniqueness, ignoring all those NULL values.

    In this article, I am going to illustrate how to maintain uniqueness on a column and also allow multiple NULL values.

    Let us assume that we have a database, MyDB, and we want to create a table that holds social security numbers, as shown below.

    USE [master]
    GO
    IF  EXISTS (SELECT name FROM sys.databases WHERE name = N'Employee')
    DROP DATABASE [Employee]
    go
    Create Database [Employee]
    go
    use [Employee]
    go
    
    Create Table Emp
    ([Employee id] int not NULL constraint Emp_pk primary key clustered,
    [First Name] varchar(100) NULL,
    [Last Name] varchar(100)  NULL,
    [Nick Name] varchar(100) NULL,
    [Social Security Number] int NULL)
    go
    

    We know social security number is unique, so let us add UNIQUE constraint to the column [Social Security Number].

    Alter table Emp Add constraint ssn_unique UNIQUE 
     ([Social Security Number] )

    Now let us try to insert some data as shown below.

    Insert into Emp ([Employee id],[First Name],[Last Name],
    [Nick Name],[Social Security Number])
    values(1,'Robert','Bates','Bob',111213422)
    
    Insert into Emp ([Employee id],[First Name],[Last Name],
    [Nick Name],[Social Security Number])
    values(2,'Robert','Bates','Bob',121213422)
    
    Insert into Emp ([Employee id],[First Name],[Last Name],
    [Nick Name],[Social Security Number])
    values(3,'Robert','William','Rob',131213422)
    
    Insert into Emp ([Employee id],[First Name],[Last Name],
    [Nick Name],[Social Security Number])
    values(4,'Sonia','Keira','Sony',131413426)
    

    As we know, social security number is unique. However, in situations of people entering this country using a work visa, it would take sometime for them to get a social security number. Until that time, the data would be NULL.

    Now let us try to insert one row without Social Security Number as shown below.

    Insert into Emp ([Employee id],[First Name],[Last Name],
    [Nick Name],[Social Security Number])
    values(5,'Mellisa','Brown','Mel',NULL)
    
    Result
    (1 row(s) affected)
    

    Now let us try to insert another row without Social Security Number as shown below.

    Insert into Emp ([Employee id],[First Name],[Last Name],
    [Nick Name],[Social Security Number])
    values(6,'Sibey','Chikhs','Ciby',NULL)
    
    Result
    
    Msg 2627, Level 14, State 1, Line 1
    Violation of UNIQUE KEY constraint 'ssn_unique'. 
     Cannot insert duplicate key in object 'dbo.Emp'.
    The statement has been terminated.
    

    This is the normal behaviour of UNIQUE constrain on a NULL column. It allows one row of data with NULL values. However, that is not the behaviour we want for this column. We want the column to accept unique values and also accept multiple NULL values.

    This can be achieved using a computed column and adding a contraint to the computed column instead of on the actual Social Security Number column.

    Now let us recreate the database from the scratch, only this time we will add a computed column as shown below.

    USE [master]
    GO
    IF  EXISTS (SELECT name FROM sys.databases WHERE name = N'Employee')
    DROP DATABASE [Employee]
    go
    Create Database [Employee]
    go
    use [Employee]
    go
    
    Create Table Emp
    ([Employee id] int not NULL constraint Emp_pk primary key clustered,
    [First Name] varchar(100) NULL,
    [Last Name] varchar(100)  NULL,
    [Nick Name] varchar(100) NULL,
    [Social Security Number] int NULL)
    go
    
    Alter table Emp Add MySSN as case when [Social Security Number]
     is NULL then [Employee id] else [Social Security Number] end
    go
    

    Now let us add the UNIQUE constraint to the computed column as shown below.

    Alter table Emp Add constraint ssn_unique UNIQUE ([MySSN] )
    go
    

    Now let us try to insert some data as shown below.

    Insert into Emp ([Employee id],[First Name],[Last Name],
    [Nick Name],[Social Security Number])
    values(1,'Robert','Bates','Bob',111213422)
    
    Insert into Emp ([Employee id],[First Name],[Last Name],
    [Nick Name],[Social Security Number])
    values(2,'Robert','Bates','Bob',121213422)
    
    Insert into Emp ([Employee id],[First Name],[Last Name],
    [Nick Name],[Social Security Number])
    values(3,'Robert','William','Rob',131213422)
    
    Insert into Emp ([Employee id],[First Name],[Last Name],
    [Nick Name],[Social Security Number])
    values(4,'Sonia','Keira','Sony',131413426)
    

    Let’s try to insert one row without Social Security Number as shown below.

    Insert into Emp ([Employee id],[First Name],[Last Name],
    [Nick Name],[Social Security Number])
    values(5,'Mellisa','Brown','Mel',NULL)
    
    Result
    (1 row(s) affected)
    
    

    Try to insert another row without Social Security Number:

    Insert into Emp ([Employee id],[First Name],[Last Name],
    [Nick Name],[Social Security Number])
    values(6,'Sibey','Chikhs','Ciby',NULL)
    
    Result
    (1 row(s) affected)
    

    If the Social Security Number column is a varchar column then we can create the computed column and the constraint as shown below in order to achieve the same goal of having unqiueness with multiple NULL values.

    USE [master]
    GO
    IF  EXISTS (SELECT name FROM sys.databases WHERE name = N'Employee')
    DROP DATABASE [Employee]
    go
    Create Database [Employee]
    go
    use [Employee]
    go
    
    Create Table Emp
    ([Employee id] int not NULL constraint Emp_pk primary key clustered,
    [First Name] varchar(100) NULL,
    [Last Name] varchar(100)  NULL,
    [Nick Name] varchar(100) NULL,
    [Social Security Number] varchar(12) NULL)
    go
    

    Let’s create the computed column for Social Security Number as shown below.

    Alter table Emp Add MySSN as case when [Social Security Number]
     is NULL then convert(varchar(12),[Employee id]) else [Social Security Number] end
    go
    

    Now let’s add the UNIQUE constraint to the computed column:

    Alter table Emp Add constraint ssn_unique UNIQUE ([MySSN] )
    go

    Let’s try to insert some data as shown below.

    Insert into Emp ([Employee id],[First Name],[Last Name],
    [Nick Name],[Social Security Number])
    values(1,'Robert','Bates','Bob','111-21-3422')
    
    Insert into Emp ([Employee id],[First Name],[Last Name],
    [Nick Name],[Social Security Number])
    values(2,'Robert','Bates','Bob','121-21-3422')
    
    Insert into Emp ([Employee id],[First Name],[Last Name],
    [Nick Name],[Social Security Number])
    values(3,'Robert','William','Rob','131-21-3422')
    
    Insert into Emp ([Employee id],[First Name],[Last Name],
    [Nick Name],[Social Security Number])
    values(4,'Sonia','Keira','Sony','131-41-3426')
    

    Now try to insert one row without Social Security Number:

    Insert into Emp ([Employee id],[First Name],[Last Name],
    [Nick Name],[Social Security Number])
    values(5,'Mellisa','Brown','Mel',NULL)
    
    Result
    (1 row(s) affected)
    

    Now let’s try to insert another row without Social Security Number as shown below.

    Insert into Emp ([Employee id],[First Name],[Last Name],
    [Nick Name],[Social Security Number])
    values(6,'Sibey','Chikhs','Ciby',NULL)
    
    Result
    (1 row(s) affected)
    

    Conclusion

    We have created a column on a table, which holds UNIQUE values and also multiple NULL values using Primary key values, computed column and UNIQUE constraint on the computed column.


    展开全文
  • NOT NULL 约束强制字段始终包含,即向字段添加,就无法插入新记录或者更新记录,也就是在插入或更新行时该列必须有。 注意:NULL时没有,它不是空串、空格等。空串、空格等是一个有效的,它不是无...

    NOT NULL 不允许空值约束

    NOT NULL 约束强制列不接受 NULL 值(NULL值就是没有值或缺值)。NOT NULL 约束强制字段始终包含值,即不向字段添加值,就无法插入新记录或者更新记录,也就是在插入或更新行时该列必须有值。

    注意:NULL值时没有值,它不是空串、空格等。空串、空格等是一个有效的值,它不是无值。

    CREATE TABLE 表名
    (
        列名称 数据类型以及长度 NOTNULL,
        ……
    );

    UNIQUE 唯一值约束

    UNIQUE 约束唯一标识数据库表中的每条记录。UNIQUE 和 PRIMARY KEY 主键约束均为列或列集合提供了唯一性的保证。PRIMARY KEY 主键约束拥有自动定义的 UNIQUE 约束。

    注意:每个表可以有多个 UNIQUE 约束,但是每个表只能有一个 PRIMARY KEY 约束。

    CREATE TABLE 表名
    (
        列名称 数据类型以及长度 UNIQUE;
        ……
    );
    
    
    为多个列定义 UNIQUE 约束
    方法一:(一次性指定)
    CREATE TABLE 表名
    (
        列名称1 数据类型以及长度;
        列名称2 数据类型以及长度;
        ……
        UNIQUE (列名称1,列名称2,……)
    );
    方法二:(分别对各个列进行指定)
    CREATE TABLE 表名
    (
        列名称1 数据类型以及长度 UNIQUE;
        列名称2 数据类型以及长度 UNIQUE;
        ……
    );

    PRIMARY KEY 主键约束

    PRIMARY KEY 主键约束唯一标识数据库表中的每条记录。主键值必须唯一。

    主键中只能使用不允许NULL值的列(即主键值不能为NULL值),允许NULL值的列不能作为唯一标识。

    注意:建议每个表只有一个主键约束。

    语法

    CREATE TABLE 表名
    (
        列名称 数据类型以及长度 PRIMARY KEY;
        ……
    );
    
    
    为多个列定义 PRIMARY KEY 约束
    CREATE TABLE 表名
    (
        列名称1 数据类型以及长度;
        列名称2 数据类型以及长度;
        ……
        PRIMARY KEY(列名称1,列名称2,……)
    );

    FOREIGN KEY 外键约束

    一个表中的 FOREIGN KEY 外键约束指向另一个表中的 PRIMARY KEY,即给 列名称1 设置了外键约束,往列名称1插入数据,这个数据一定是要在FORFIGN KEY后面所跟的那个参照表的列名称中存在的值,外键约束了数据的完整性,不会插入错误的数据。

    添加了外键之后,插入引用表的记录要么必须被引用表中被引用列的某条记录匹配,要么外键列的值必须设置为NULL。

    每个表中的外键数目不限制唯一性,并且一个列只能引用一个外键,一个列可以被多个外键引用。

    语法

    CREATE TABLE 表名称
    (
        列名称1 数据类型及长度,
        列名称2 数据类型及长度 FOREIGN KEY REFERENCES 参照表的表名称(参照表的列名称)
        ……
    )
    
    
    MySQL使用语法
    CREATE TABLE 表名
    (
        列名称 数据类型以及长度;
        ……
        FOREIGN KEY (列名称) REFERENCES 参照表的表名称(参照表的列名称)
    );
    
    
    为多个列定义 FOREIGN KEY 约束
    CREATE TABLE 表名
    (
        列名称1 数据类型以及长度;
        列名称2 数据类型以及长度;
        ……
        FOREIGN KEY(列名称1,列名称2……) REFERENCES 参照表的表名称(参照表的列名称1,参照表的列名称2)
    );

    CHECK 约束

    CHECK 约束用于限制列中的值的范围。如果对单个列定义 CHECK 约束,那么该列只允许特定的值。如果对一个表定义 CHECK 约束,那么此约束会在特定的列中对值进行限制。

    为多个列定义CHECK约束应使用AND关键字进行连接。

    语法

    CREATE TABLE 表名称
    (
        列名称 数据类型及数据长度 CHECK(值范围条件),
        ……
    );
    
    
    为表中多个列定义 CHECK 约束
    CREATE TABLE 表名称
    (
        列名称1 数据类型及数据长度,
        列名称2 数据类型及数据长度,
        ……
        CHECK(列名称1值范围条件 AND 列名称2值范围条件 AND ……)
    );

    DEFAULT 约束

    DEFAULT 约束用于向列中插入默认值。如果没有规定其他的值,那么会将默认值添加到所有的新记录。

    建议创建数据库时使用默认值而不是允许值为NULL,这样可以有助于数据库管理和开发。

    注意:大多数DBMS不允许使用函数作为默认值,只支持常量。

    CREATE TABLE 表名称
    (
        列名称 数据类型及数据长度 DEFAULT 常量值,
        ……
    );

    AUTO_INCREMENT 自动递增约束

    AUTO_INCREMENT可以在新记录插入表中时自动地创建唯一的数值(即进行自动增量),并且每个表只允许一个AUTO_INCREMENT列,而且它必须被索引(如通过使用AUTO_INCREMENT成为主键)。

    注意:AUTO_INCREMENT 的默认开始值是 1,每条新记录自动递增 1。

    语法

    CREATE TABLE 表名称
    (
        列名称 数据类型及数据长度 AUTO_INCREMENT,
        ……
    );

     

    展开全文
  • Mysql给某添加唯一约束

    千次阅读 2020-09-03 17:18:15
    Mysql给某添加唯一约束

    Mysql设置某列的值唯一

    1.创建表的时候

    这里举例创建student表
    (id不为空,自增;name不为空;idCard不为空,并且值唯一)
    
    CREATE TABLE `t_student` (
    `Id` int(11) NOT NULL AUTO_INCREMENT,  
    `name` varchar(18) NOT NULL ,  
    `idCard` varchar(18) NOT NULL unique,
    PRIMARY KEY (`Id`)
    ) ENGINE=InnoDB AUTO_INCREMENT=1018 DEFAULT CHARSET=utf8;
    

    2.给已经建好的表加上唯一性约束

    	第一种:
    		mysql语句:
    		ALTER TABLE `t_student` ADD CONSTRAINT unique_taskCode UNIQUE(taskCode);
    		语句解释:
    		ALTER TABLE <表名称> ADD CONSTRAINT <约束名称> UNIQUE(<约束字段>);
    	第二种:
    		mysql语句:
    		ALTER TABLE `t_student` MODIFY COLUMN taskCode VARCHAR(20) UNIQUE;
    		语句解释:
    		ALTER TABLE <表名称> MODIFY COLUMN  <约束字段>  <约束字段类型> UNIQUE;
    

    注意事项:

    这里我是给已经建好的表加约束,但是有一个错误提示,如下:
    在这里插入图片描述
    我一直以为是自己的mysql语句错误,找了文档,发现没毛病啊,最后翻译这话,意思是需要建立约束的字段值‘2’存在重复数据,所以如果表中有数据,然后要给某一列加唯一约束需要先把该字段对应的数据查看一遍,确定没有重复数据才可以添加成功;

    3.查看表中所有的约束

    	mysql语句:DESC `t_student`;
    	语句解释:DESC <表名称>;
    

    4.删除约束:

    	mysql语句:ALTER TABLE `t_student` DROP INDEX  taskCode ; 
    	语句解释:ALTER TABLE <表名> DROP INDEX  <约束名>	;
    
    展开全文
  • 唯一约束和唯一索引区别

    千次阅读 2017-09-21 21:02:55
    3) 主键上没有任何两行具有相同(即重复),允许(NULL).4) 主健可作外健,唯一索引可; 2.唯一约束(UNIQUE) 1) 唯一约束用来限制受主键约束上的数据的唯一性,用于作为访问...
  • 同一具有UNIQUE约束或者行,可以允许...它来定义基本表的主键,起唯一标识作用,值不能是NULL,能重复,以此来保证实体的完整性。   黑色头发 http://heisetoufa.iteye.com 如果发现本文有误,欢迎批评指正...
  • MySQL唯一约束(Unique Key)要求该列唯一,允许为空,但只能出现一个空值。唯一约束可以确保一或者几列出现重复。 非空约束 MySQL非空约束(NOT NULL)可以通过 CREATE TABLE 或 ALTER TABLE 语句实现。在...
  • 非空约束:是指 某些列不能设置NULL,所以要对添加非空约束 非空约束的特点:可以为空,但可以是重复 NOT NULL 是非空约束的关键字 CREATE TABLE student ( sid INT PRIMARY KEY AUTO_INCRAMENT, ...
  • 主键约束和唯一约束的区别

    千次阅读 2017-11-14 09:30:26
    3) 主键上没有任何两行具有相同(即重复),允许(NULL). 4) 主健可作外健,唯一索引可; 2.唯一约束(UNIQUE) 1) 唯一约束用来限制受主键约束上的数据的唯一性,用于作为访问某行...
  • 主键约束唯一约束唯一索引

    千次阅读 2018-07-22 00:23:40
    3) 主键上没有任何两行具有相同(即重复),允许(NULL). 4) 主健可作外健,唯一索引可; 2.唯一约束(UNIQUE) 1) 唯一约束用来限制受主键约束上的数据的唯一性,用于作为访问某行的可...
  • NULL:字段可以为空 NOT NULL:字段禁止为空。使用了费空约束的字段如果在添加数据时,没有指定,数据库系统会报错。 添加非空约束 或者 删除非空约束 主键约束: 注意:一张表中...
  • 约束 * 概念: 对表中的数据进行限定,保证数据的正确性、有效性和完整性。 * 分类: 1. 主键约束:primary key 2. 非空约束:not null 3. 唯一约束:unique 4.... * 非空约束:not null,值不null 1....
  • 数据库唯一约束(Unique Constraint)

    万次阅读 2019-01-10 09:38:07
    唯一性约束要求该列唯一,允许为空,但只能出现一个空值。唯一约束可以确保一或者几列出现重复。 语法:  1、在定义完之后直接指定唯一约束 字段名 数据类型 UNIQUE  2、在定义完所有之后指定唯一...
  • 唯一约束保证没有重复被插入到中,当该列上创建有唯一约束的时候。当上创建了唯一约束时,对应的会在该列自动创建唯一索引 验证这些差异,我们创建一个测试表,创建完成后,使用sp_helpindex查看表的索引...
  • 主键约束(PRIMARY KEY)和唯一约束(UNIQUE)的区别

    万次阅读 多人点赞 2019-09-09 17:24:22
    主键上没有任何两行具有相同(即重复),允许(NULL). 主健可作外健,唯一索引可; 2.唯一约束(UNIQUE) 唯一约束用来限制受主键约束上的数据的唯一性,用于作为访问某行的可选手段,一...
  • 1.表(记表A)的主键是数据库序列生成的,存在测试环境常见的因为插入测试数据导致后续通过数据库序列生成的主键冲突的问题 2.检查了数据库表结构的约束,发现只有主键约束。 然后检查了插入数据的SQL,如下:...
  • 我们都知道unique约束,限制此字段在数据库表中此字段值唯一但是如果我们传值,那么他默认null的话,可以有多个吗?   结论:在mysql中unique约束列可以含有多个null!...
  • 数据表创建之唯一约束 unique

    千次阅读 2018-02-07 17:12:56
    即使某一项字段设置了唯一约束,null也不会收到唯一约束的影响,即含有唯一约束的数据上可以存在一次或多次为空 语法:例如email 字段设置唯一约束 constraint uk_email unique(email)
  • 唯一约束:unique 外键约束:foreign key 1.1 非空约束:not null 1)在创建表时添加约束: CREATE TABLE stu( id INT, NAME VARCHAR(20) NOT NULL -- name非空 ); 2)创建表后再添加非空约束: ALTER ...
  • 表的约束空属性及非空属性默认值描述zerofill主键自增长索引唯一键外键 表的约束很多,这里主要介绍如下几个: null/not null,default, comment, zerofill,primary key,auto_increment,unique key 。 属性...
  • 主键约束唯一约束的区别

    千次阅读 2014-08-08 18:01:13
    3) 主键上没有任何两行具有相同(即重复),允许(NULL). 4) 主健可作外健,唯一索引可; 2.唯一约束(UNIQUE) 1) 唯一约束用来限制受主键约束上的数据的唯一性,用于作为访问某行...
  • 一行或多行中包含违反非空、唯一或外键约束。 一开始按照字面意思,以为是查询到的数据中非字段中存在空值,或者主键重复等问题,但是找了半天也没有,然后在网上搜索了下这个问题,有人给出的结论是:强类型...
  • 比如有一个字段是email,要求唯一的。 表的约束很多,这里主要介绍如下几个: null/not null,default,comment,zerofill,primary key,auto_increment,unique key。 1.属性 两个 :null(默...
  • 注意: A.表中有数据能创建约束 ...主键是每行的唯一标识符,仅仅通过它就能准确定位到一行,其中主键在整个表中能有重复,必须包含唯一(NULL)。 alter table t_group  alter column id i...
  • 约束类型按功能包括有:非空约束、主键约束、唯一约束、默认约束、外键约束、 【自动编号】AUTO_INCREMENT 起始值1,增量1。 自动编号的字段必须数值型,若浮点数小数位数必须0。 自动编号必须和主键组合...
  • 1.主键约束(PRIMARY KEY) 主键用于唯一地标识表中的每一条记录 ... 唯一约束用来限制受主键约束上的数据的唯一性, 即表中任意两行在 指定上都允许有相同的。3.唯一索引(INDEX) 创建唯

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 57,174
精华内容 22,869
关键字:

唯一约束要求该列的值不为空