约束
约束保证数据的完整性和一致性
按约束字段数量划分
列级约束和表级约束
列级约束 对一个数据列建立的约束
表级约束 对多个数据列建立的约束
列级约束既可以在列定义时声明,也可以在列定义后声明; 表级约束只能在列定义后声明.
并不是所有约束都存在表级约束。如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
);