SQL 约束(Constraints)
SQL 约束用于规定表中的数据规则。如果存在违反约束的数据行为,行为会被约束终止。
约束可以在创建表时规定(通过 create table 语句),或者在表创建之后规定(通过 alter table 语句)。
在 SQL 中,我们有如下约束:
- not null 指示某列不能存储 NULL 值。
- unique 保证某列的每行必须有唯一的值。
- primary key 是not null 和 unique 的结合。确保某列(或两个列多个列的结合)有唯一标识,有助于更容易更快速地找到表中的一个特定的记录。
- foreign key 保证一个表中的数据匹配另一个表中的值的参照完整性。
- check 保证列中的值符合指定的条件。
- default 规定没有给列赋值时的默认值。
SQL not null 约束
在默认的情况下,表的列接受 null 值。
not null 约束强制列不接受 null 值。
not null 约束强制字段始终包含值。这意味着,如果不向字段添加值,就无法插入新记录或者更新记录。
下面的 SQL 强制 "ID" 列、 "LastName" 列以及 "FirstName" 列不接受 NULL 值:
create table Persons (
ID int not null,
LastName varchar(255) not null,
FirstName varchar(255) not null,
Age int
);
- 添加 not null 约束
在一个已创建的表的 "Age" 字段中添加 not null 约束如下所示:
alter table Persons
modify Age int not null;
- 删除 not null 约束
在一个已创建的表的 "Age" 字段中删除 not null 约束如下所示:
alter table Persons
modify Age int null;
SQL unique 约束
unique
约束唯一标识数据库表中的每条记录。
unique
和 primary key
约束均为列或列集合提供了唯一性的保证。
primary key
约束拥有自动定义的 unique
约束。
请注意:每个表可以有多个 unique 约束,但是每个表只能有一个 primary key 约束。
-
create table
时的SQL unique
约束
下面的 SQL 在 "Persons" 表创建时在 "P_Id" 列上创建 UNIQUE 约束:
使用的库为SQL Server / Oracle / MS Access:
create table Persons
(
P_Id int not null unique,
LastName varchar(255) not null,
FirstName varchar(255),
Address varchar(255),
City varchar(255)
);
如需命名 unique 约束,并定义多个列的 unique 约束,请使用下面的 SQL 语法:
在MySQL / SQL Server / Oracle / MS Access 库的多列约束:
create table Persons
(
P_Id int not null,
LastName varchar(255) not null,
FirstName varchar(255),
Address varchar(255),
City varchar(255),
constraint uc_PersonID unique(P_Id,LastName)
);
用 alter table 的 SQL unique 约束
当表已被创建时,如需在 "P_Id" 列创建 unique 约束,请使用下面的 SQL:
适用库MySQL / SQL Server / Oracle / MS Access:
alter table Persons
add unique(P_Id)
如需命名 unique 约束,并定义多个列的 unique约束,请使用下面的 SQL 语法:
适用库 MySQL / SQL Server / Oracle / MS Access:
alter table Persons
add constraints uc_PersonID unique (P_Id,LastName)
撤销 unique 约束
如需撤销 unique 约束,请使用下面的 SQL:
适用库 SQL Server / Oracle / MS Access:
alter table Persons
drop constraint uc_PersonID
SQL primary key 约束
primary key约束唯一标识数据库表中的每条记录。
- 主键必须包含唯一的值。
- 主键列不能包含 NULL 值。
- 每个表都应该有一个主键,并且每个表只能有一个主键。
创建表时创建primary key 约束
适用库SQL Server / Oracle / MS Access:
create table Persons
(
P_Id int not null primary key,
LastName varchar(255) not null,
FirstName varchar(255),
Address varchar(255),
City varchar(255)
)
创建表的主键同时为主键重命名
create table Persons
(
P_Id int not null,
LastName varchar(255) not null,
FirstName varchar(255),
Address varchar(255),
City varchar(255),
constraint pk_PersonID primary key (P_Id,LastName)
)
- alter table 时的 SQL primary key约束
当表已被创建时,如需在 "P_Id" 列创建 primary key约束,请使用下面的 SQL:
MySQL / SQL Server / Oracle / MS Access:
alter table Persons
add primary key(P_Id)
如需命名 primary key约束,并定义多个列的 primary key约束,请使用下面的 SQL 语法:
MySQL / SQL Server / Oracle / MS Access:
alter table Persons
add constraing pk_PersonID primary key(P_Id,LastName)
注释:如果您使用 alter table语句添加主键,必须把主键列声明为不包含 null 值(在表首次创建时)。
- 撤销 primary key 约束
如需撤销 primary key 约束,请使用:
alter table Orders
drop constraing fk_PerOrders
SQL check约束
- check 约束用于限制列中的值的范围。
- 如果对单个列定义 check 约束,那么该列只允许特定的值。
- 如果对一个表定义 check 约束,那么此约束会基于行中其他列的值在特定的列中对值进行限制。
create table时的 SQL check约束
下面的 SQL 在 "Persons" 表创建时在 "P_Id" 列上创建 check 约束。check 约束规定 "P_Id" 列必须只包含大于 0 的整数。
create table Persons
(
P_Id int not null check (P_Id>0),
LastName varchar(255) not null,
FirstName varchar(255),
Address varchar(255),
City varchar(255)
)
如需命名 CHECK 约束,并定义多个列的 CHECK 约束,请使用下面的 SQL 语法:
create table Persons
(
P_Id int not null,
LastName varchar(255) not null,
FirstName varchar(255),
Address varchar(255),
City varchar(255),
constraing chk_Person check (P_Id>0 AND City='Sandnes')
)
alter table 时的 SQL check 约束
当表已被创建时,如需在 "P_Id" 列创建 check 约束,请使用下面的 SQL:
alter table Persons
add check (P_Id>0)
如需命名 check 约束,并定义多个列的 check 约束,请使用下面的 SQL 语法:
ALTER TABLE Persons
ADD CONSTRAINT chk_Person CHECK (P_Id>0 AND City='Sandnes')
撤销 check 约束
如需撤销 check 约束,请使用下面的 SQL:
alter table Persons
drop constraing chk_Person
SQL default约束
default 约束用于向列中插入默认值。
如果没有规定其他的值,那么会将默认值添加到所有的新记录。
- create table 时的 SQL default约束
下面的 SQL 在 "Persons" 表创建时在 "City" 列上创建 DEFAULT 约束:
create table Persons
(
P_Id int not null,
LastName varchar(255) not null,
FirstName varchar(255),
Address varchar(255),
City varchar(255) default 'Sandnes'
)
- 通过使用类似 getdate() 这样的函数,default 约束也可以用于插入系统值:
create table Orders
(
O_Id int not null,
OrderNo int not null ,
P_Id int,
OrderDate date default getdate()
)
alter table 时的 SQL default 约束
当表已被创建时,如需在 "City" 列创建 default 约束,请使用下面的 SQL:
alter table Persons
modify City default 'SANDNES'
撤销 default 约束
如需撤销 default 约束,请使用下面的 SQL:
alter table Persons
alter column City drop default
SQL create index 语句
- create index 语句用于在表中创建索引。
- 在不读取整个表的情况下,索引使数据库应用程序可以更快地查找数据。
- 用户无法看到索引,它们只能被用来加速搜索/查询。
注释:更新一个包含索引的表需要比更新一个没有索引的表花费更多的时间,这是由于索引本身也需要更新。因此,理想的做法是仅仅在常常被搜索的列(以及表)上面创建索引。
SQL create index 语法
在表上创建一个简单的索引。允许使用重复的值:
create index index_name
on table_name (column_name)
SQL create unique index 语法
在表上创建一个唯一的索引。不允许使用重复的值:唯一的索引意味着两个行不能拥有相同的索引值。
create unique index index_name
on table_name (column_name)
注释:用于创建索引的语法在不同的数据库中不一样。因此,检查您的数据库中创建索引的语法。
create index 实例
下面的 SQL 语句在 "Persons" 表的 "LastName" 列上创建一个名为 "PIndex" 的索引:
create index PIndex
on Persons (LastName)
如果您希望索引不止一个列,您可以在括号中列出这些列的名称,用逗号隔开:
create index PIndex
on Persons (LastName, FirstName)
SQL 撤销索引、撤销表以及撤销数据库
通过使用 drop 语句,可以轻松地删除索引、表和数据库。
- SQL 撤销索引语法:
drop index 语句用于撤销索引。
drop index index_name
- SQL撤销表语法:
drop table 语句用于删除表。
drop table table_name
- SQL 撤销数据库:
drop database 语句用于删除数据库。
drop database database_name
如果我们仅仅需要删除表内的数据,但并不删除表本身,那么我们应该使用truncate table 语句
truncate table table_name
alter table 语句
alter table 语句用于在已有的表中添加、删除或修改列。
- 如需在表中添加列,请使用下面的语法:
alter table table_name
add column_name datatype
- 如需删除表中的列,请使用下面的语法:
请注意:某些数据库系统不允许在数据库表中删除列。
alter table table_name
drop column column_name
- 要改变表中列的数据类型,请使用下面的语法:
alter table table_name
modify column_name datatype;
SQL auto increment 字段
Auto-increment 会在新记录插入表中时生成一个唯一的数字。
auto increment 字段
我们通常希望在每次插入新记录时,自动地创建主键字段的值。
我们可以在表中创建一个 auto-increment 字段。
- 用于 Oracle 的语法
在 Oracle 中,代码稍微复杂一点。
您必须通过 sequence
对象(该对象生成数字序列)创建 auto-increment 字段。
请使用下面的 create sequence 语法:
create sequence seq_person
minvalue 1
start with 1
increment by 1
cache 10; --缓冲10
上面的代码创建一个名为 seq_person 的 sequence 对象,它以 1 起始且以 1 递增。该对象缓存 10 个值以提高性能。cache 选项规定了为了提高访问速度要存储多少个序列值。
要在 "Persons" 表中插入新记录,我们必须使用 nextval 函数(该函数从 seq_person 序列中取回下一个值):
insert into Persons (ID,FirstName,LastName)
values (seq_person.nextval,'Lars','Monsen')
上面的 SQL 语句会在 "Persons" 表中插入一条新记录。"ID" 列会被赋值为来自 seq_person 序列的下一个数字。"FirstName"列 会被设置为 "Lars","LastName" 列会被设置为 "Monsen"。