SQL Server唯一约束

SQL Server UNIQUE约束简介 SQL Server UNIQUE 约束用于确保存储在列或列组中的数据在表中的行中是唯一的。 以下语句创建一个表: hr.persons ,其 email 邮件列中的数据在表的行中是唯一的:

CREATE SCHEMA hr;

GO

CREATE TABLE hr.persons(

 person_id INT IDENTITY PRIMARY KEY,

 first_name VARCHAR(255) NOT NULL,

last_name VARCHAR(255) NOT NULL,

 email VARCHAR(255) UNIQUE );

在此语法中,将 UNIQUE 约束定义为列约束。

还可以将 UNIQUE 约束定义为表约束:

CREATE TABLE hr.persons(

person_id INT IDENTITY PRIMARY KEY,

first_name VARCHAR(255) NOT NULL,

last_name VARCHAR(255) NOT NULL,

 email VARCHAR(255), UNIQUE(email) );

SQL Server自动创建 UNIQUE 索引以强制存储在参与 UNIQUE 约束的列中的数据的唯一性。

因此,如果尝试插入重复行,SQL Server将拒绝更改并返回一条错误消息,提示说已违反 UNIQUE 约 束。 以下语句在 hr.persons 表中插入一个新行:

INSERT INTO hr.persons(first_name, last_name, email)

VALUES('Max','Su','maxsu@yiibai.com');

 SQL

上面语句按预期工作。 由于 email 具有 UNIQUE 约束,同一表中 email 列的值不能相同,所以下面插入 语句会失败:

INSERT INTO hr.persons(first_name, last_name, email)

 VALUES('Max2','Su2','maxsu@yiibai.com');

SQL Server发出类似下面错误消息:

Violation of UNIQUE KEY constraint 'UQ__persons__XAXCDXXXXXE8240E4E'.

Cannot insert duplicate key in object 'hr.persons'. The duplicate key value is (maxsu@yiibai.com).

如果没有为 UNIQUE 约束指定名称,SQL Server将自动为其生成名称。 在此示例中,自动生成的约束名称为: UQ__persons__XAXCDXXXXXE8240E4E ,是不是有点不太可读? 要为 UNIQUE 约束指定特定名称,请使用 CONSTRAINT 关键字,如下所示:

CREATE TABLE hr.persons (

person_id INT IDENTITY PRIMARY KEY,

first_name VARCHAR(255) NOT NULL,

last_name VARCHAR(255) NOT NULL,

email VARCHAR(255), CONSTRAINT unique_email UNIQUE(email) );

上面语句中,指定了 UNIQUE 约束名称为: unique_email 。 为 UNIQUE 约束指定名称的好处是: 更容易对错误消息进行分类。 修改约束时,可以引用此约束的名称。

 UNIQUE约束与PRIMARY KEY约束 尽管 UNIQUE 和 PRIMARY KEY 约束都强制数据的唯一性,但是当要强制实现不是主键列的列或列组的唯 一性时,应使用 UNIQUE 约束而不 是 PRIMARY KEY 约束。 与 PRIMARY KEY 约束不同, UNIQUE 约束允许 NULL 值。 此外, UNIQUE 约束将 NULL 视为常规值,因 此,它只允许每列一个 NULL 。 以下语句插入一行,其 email 列中的值为 NULL :

INSERT INTO hr.persons(first_name, last_name)

 VALUES('Yiibai','Su');

现在,如果尝试在 email 列中再插入一个 NULL ,则会收到错误消息:

INSERT INTO hr.persons(first_name, last_name) VALUES('Lily','Lee');

执行上面插入语句,将会提示以下错误:

Violation of UNIQUE KEY constraint 'UQ__persons__AB382E6S7DF0E9W'. Cannot insert duplicate key in object 'hr.persons'. The duplicate key value is ().

具有多列的UNIQUE约束 要为一组列定义 UNIQUE 约束,可以将其写为表约束,列名以逗号分隔,如下所示:

CREATE TABLE table_name (

 key_column data_type PRIMARY KEY,

column1 data_type,

column2 data_type,

column3 data_type, ...,

UNIQUE (column1,column2,...column_n)

);

以下示例创建一个 UNIQUE 约束,此约束包含两列: person_id 和 skill_id :

CREATE TABLE hr.person_skills ( id INT IDENTITY PRIMARY KEY, person_id int, skill_id int, updated_at DATETIME, UNIQUE (person_id, skill_id) );

将UNIQUE约束添加到列 将 UNIQUE 约束添加到表中的现有列或一组列时,SQL Server首先检查这些列中的现有数据,以确保所 有值都是唯一的。 如果SQL Server找到重复值,则它将返回错误,并且不会执行添加 UNIQUE 约束。 以下显示了向表中添加 UNIQUE 约束的语法:

ALTER TABLE table_name ADD CONSTRAINT constraint_name UNIQUE(column1, column2,...);

假设有以下 hr.persons 表:

CREATE TABLE hr.persons ( person_id INT IDENTITY PRIMARY KEY, first_name VARCHAR(255) NOT NULL, last_name VARCHAR(255) NOT NULL, email VARCHAR(255), phone VARCHAR(20), );

以下语句向 email 列添加 UNIQUE 约束:

ALTER TABLE hr.persons ADD CONSTRAINT unique_email UNIQUE(email);

类似地,以下语句将向 phone 列添加 UNIQUE 约束:

ALTER TABLE hr.persons ADD CONSTRAINT unique_phone UNIQUE(phone);

删除UNIQUE约束 要删除 UNIQUE 约束,请使用 ALTER TABLE DROP CONSTRAINT 语句,如下所示:

ALTER TABLE table_name DROP CONSTRAINT constraint_name;

以下语句用于从 hr.person 表中删除名称为: unique_phone 的约束:

ALTER TABLE hr.persons DROP CONSTRAINT unique_phone;

修改UNIQUE约束 SQL Server没有任何直接语句来修改 UNIQUE 约束,因此,如果要更改约束,则需要先删除约束并重新 创建约束。

  • 2
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值