约束
约束保证数据的完整性和一致性
按约束字段数量划分
列级约束和表级约束
- 列级约束 对一个数据列建立的约束
- 表级约束 对多个数据列建立的约束
列级约束既可以在列定义时声明,也可以在列定义后声明; 表级约束只能在列定义后声明.
并不是所有约束都存在表级约束。如NOT NULL
和DEFAULT
约束不存在表级约束.
按功能划分
-
PRIMARY KEY
主键 -
FOREIGN KEY
外键 -
UNIQUE KEY
唯一 -
NOT NULL
非空 -
DEFAULT
默认
主键约束 PRIMARY KEY
主键会自动创建索引.
- 一张表只能有一个主键
- 主键保证记录的唯一性
- 主键自动为
NOT NULL
AUTO_INCREMENT
只能用于主键,默认从1开始,自增1.
CREATE TABLE tb3(
id SMALLINT UNSIGNED AUTO_INCREMENT PRIMARY KEY,--指定主键
username VARCHAR(30) NOT NULL
);
外键约束 FOREIGN KEY
实现一对一或一对多的关系(关系型数据库)
- 子表: 具有外键列的表
- 父表: 子表参照的表
外键约束的要求:
- 1.父表和子表必须均使用InnoDB存储引擎,而且禁止使用临时表,MyISAM表暂时不支持外键
- 2.外键列和参照列必须具有类似的数据类型(比如int和tinyint可以,而int和char则不可以)。其中数字是否有符号位必须相同.
- 3.MySQL 4.1.2以后的版本在建立外键时会自动创建索引,外键列和参照列必须创建索引。
- 4.MySQL中外键参照的外表列不一定是主键,但必须是唯一性索引(UNIQUE)。
修改数据表的默认存储引擎:
mysql配置文件(my.ini):
default-storage-engine=INNODB;
外键约束的参照操作
FOREIGN KEY(pid) REFERENCES provinces (id) ON DELETE CASCADE
-
CASCADE
级联操作,从父表删除或更新行会自动删除或更新子表中匹配的行 -
SET NULL
从父表删除或更新行,并设置子表中的外键列为NULL。前提必须保证子表外键列没有非空约束NOT NULL -
RESTRICT
拒绝对父表的删除或更新操作 -
NO ACTION
标准SQL的关键字,在MySQL中与RESTRICT相同
唯一约束 UNIQUE KEY
- 唯一约束可以保证记录的唯一性
- 唯一约束的字段可以为空值(
NULL
) - 每张数据表可以存在多个唯一约束
唯一约束的字段虽然可以为NULL
,却只能有一条记录为NULL
,因为要保证唯一性.
CREATE TABLE tb5(
id SMALLINT UNSIGNED AUTO_INCREMENT PRIMARY KEY,
username VARCHAR(20) NOT NULL UNIQUE KEY, --唯一约束
age tinyint UNSIGNED
);
非空约束 NOT NULL
插入记录时,该字段不能为空.
默认约束 DEFAULT
当插入记录时,如果没有明确为字段赋值,则自动赋予默认值。
CREATE TABLE tb6(
id SMALLINT UNSIGNED AUTO\_INCREMENT PRIMARY KEY,
username VARCHAR(20) NOT NULL UNIQUE KEY,
sex ENUM('1','2','3') DEFAULT '3' --默认值为3
);
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。