0%

SQL 约束

约束用于规定表中的数据规则。如果存在违反约束的行为,行为将会被终止。

  • 约束可以在创建表时通过CREATE TABLE 语句规定

  • 也可以在创建表之后通过 ALTER TABLE 语句规定

语法

1
2
3
4
5
CREATE TABLE table_name {
column1 data_type(size) constraint_name,
column2 data_type(size) constraint_name,
...
};

约束与含义

约束名 含义
NOT NULL 指某列不能存储NULL值
UNIQUE 指某列的每行必须有唯一值
PRIMARY KEY 保证某列有唯一标识
FOREIGN KEY 一个表中数据匹配另一个表中数据的参照完整性
CHECK 列中的数据符合指定条件
DEFAULT 没有给列赋值时的默认值
INDEX 用于快速访问数据库表中的数据

NOT NULL

在默认情况下,表的列接收NULL值。NOT NULL强制该列不接受NULL值。

语法

  • 添加NOT NULL约束
1
2
ALTER TABLE table_name
MODIFY column1 daya_type NOT NULL;
  • 删除NOT NULL约束
1
2
ALTER TABLE table_name
MODIFY column1 daya_type NULL;

UNIQUE

UNIQUE用于约束一个或多个列中的值均是唯一的,即不能有重复值存在。

  • UNIQUE与PRIMARY KEY的区别在于,UNIQUE允许列中有NULL值,而PRIMARY KEY 不允许 NULL值。

语法

  • 创建带有UNIQUE约束的表
1
2
3
4
5
CREATE TABLE table_name {
column1 data_type(size) constraint_name,
column2 data_type(size) constraint_name,
UNIQUE(column1)
};
  • 创建使用UNIQUE约束多个列的表
1
2
3
4
5
6
CREATE TABLE table_name {
column1 data_type(size) constraint_name,
column2 data_type(size) constraint_name,
column3 data_type(size) constraint_name,
CONSTRAINT constraint_name UNIQUE (column1, column2)
};
  • 表已存在,为单个列添加UNIQUE约束
1
2
ALTER TABLE table_name
ADD UNIQUE (column1);
  • 表已存在,为多个列添加UNIQUE约束
1
2
ALTER TABLE table_name
ADD CONSTRAINT constraint_name UNIQUE (column1, column2);
  • 移除UNIQUE约束
1
2
ALTER TABLE table_name
DROP INDEX constraint_name;

PRIMARY KEY

PRIMARY KEY 唯一标识数据库表中的每条记录。

  • PRIMARY KEY 必须包含唯一的值,且不能包含NULL值。

  • PRIMARY KEY 可以由一个列或多个列组成。

  • 每个表只能有一个PRIMARY KEY

语法

  • 创建表时建立PRIMARY KEY 约束
1
2
3
4
5
6
7
CREATE TABLE table_name {
column1 data_type(size) constraint_name,
column2 data_type(size) constraint_name,
column3 data_type(size) constraint_name,
PRIMARY KEY(column3)
...
};
  • 表已存在,添加PRIMARY KEY 约束
1
2
ALTER TABLE table_name
ADD PRIMARY KEY (column1);
  • 撤销PRIMARY KEY约束
1
2
ALTER TABLE table_name
DROP PRIMARY KEY;

FOREIGN KEY

FOREIGN KEY 指外键。一个表中的FOREIGN KEY指向另一个表中的UNIQUE KEY。

  • FOREIGH KEY必须是它指向表中的值之一。

语法

  • 创建表时建立FOREIGN KEY 约束
1
2
3
4
5
6
7
8
CREATE TABLE table_name2 {
column1 data_type(size) constraint_name,
column2 data_type(size) constraint_name,
column3 data_type(size) constraint_name,
column4 data_type(size) constraint_name,
PRIMARY KEY(cloumn1),
FOREIGN KEY(column2) REFERENCES table_name1(column2)
};
  • 表已创建,添加FOREIGN KEY 约束
1
2
3
ALTER TABLE table_name2
ADD FOREIGN KEY (column1)
REFERENCES table_name1(column1);
  • 移除FOREIGN KEY 约束
1
2
ALTER TABLE table_name2
DROP FOREIGN KEY foreign_key_name;

CHECK

CHECK用于限制列中值的范围。

语法

  • 在创建表时添加CHECK约束
1
2
3
4
5
6
CREATE TABLE table_name {
column1 data_type(size) constraint_name,
column2 data_type(size) constraint_name,
column3 data_type(size) constraint_name,
CHECK (column1>0
};
  • 表已创建,添加CHECK约束
1
2
ALTER TABLE table_name
ADD CHECK (column1>0);
  • 移除CHECK约束
1
2
ALTER TABLE table_name
DROP CHECK constraint_name;

DEFAULT

DEFAULT约束用于向列中插入默认值。

语法

  • 在创建表时添加DEFAULT约束
1
2
3
CREATE TABLE table_name{
column1 data_type(size) DEFAULT default_value
};
  • 表已创建,添加DEFAULT约束
1
2
ALTER TABLE table_name
ALTER COLUMN column1 SET DEFAULT default_value;
  • 移除DEFAULT约束
1
2
ALTER TABLE table_name
ALTER COLUMN column1 DROP DEFAULT;

适用场景

  • 设置当前日期为默认日期

  • 设置0为默认值

  • 设置“开启”为默认状态

CREATE INDEX

CREATE INDEX 用于在表中创建索引,在不访问整个表的情况下,索引可以帮助数据库应用程序更快地检索数据。

语法

  • 为单个列创建索引
1
2
CREATE INDEX index_name
ON table_name(column_name);
  • 为多个列创建索引
1
2
CREATE INDEX index_name
ON table_name(column_name1, column_name2);