MySQL基础知识(二)——数据表和约束

十二.约束

约束可以保证数据的完整性和一致性;约束分为表级约束和列级约束。

1.PRIMARY KEY主键约束

  • 每张数据表只能存在一个主键
  • 主键保证记录的唯一性
  • 主键自动为NOT NULL
#自增主键,使用 PRIMARY KEY
CREATE TABLE IF NOT EXISTS user4(id INT(2) UNSIGNED AUTO_INCREMENT PRIMARY KEY,username VARCHAR(20) UNIQUE KEY,age TINYINT UNSIGNED,salary FLOAT(9,2) UNSIGNED);
#自增主键,直接使用 KEY也是OK的,但建议直接使用 PRIMARY KEY,可读性好,比较统一
CREATE TABLE IF NOT EXISTS user5(id INT(2) UNSIGNED AUTO_INCREMENT KEY,username VARCHAR(20) UNIQUE KEY,age TINYINT UNSIGNED,salary FLOAT(9,2) UNSIGNED);
#非自增主键
CREATE TABLE IF NOT EXISTS user6(id INT(2) UNSIGNED PRIMARY KEY,username VARCHAR(20) UNIQUE KEY,age TINYINT UNSIGNED,salary FLOAT(9,2) UNSIGNED);

创建完成后,可以使用desc tablename;命令,查看表结构,主键是否增加成功。

如图所示可以看到主键创建成功。

  MySQL基础知识(二)——数据表和约束

2.UNIQUE KEY 唯一约束

  • 唯一约束可以保证记录的唯一性;
  • 唯一约束的字段可以为NULL;
  • 每张数据表可以存在多个唯一约束。
#为username字段 设置唯一约束
CREATE TABLE IF NOT EXISTS user4(id INT(2) UNSIGNED AUTO_INCREMENT PRIMARY KEY,username VARCHAR(20) UNIQUE KEY,age TINYINT UNSIGNED,salary FLOAT(9,2) UNSIGNED);

创建完成后,可以使用desc tablename;命令,查看表结构,唯一约束是否增加成功。

如图所示可以看到唯一约束创建成功。

 MySQL基础知识(二)——数据表和约束

设置唯一约束的元素要有唯一性不能重复。如果username重复数据库会报错:

ERROR 1062 (23000): Duplicate entry 'kimtian' for key 'username'

MySQL基础知识(二)——数据表和约束

3.DEFAULT 默认约束 

  • 默认值;
  • 当插入记录时,如果没有明确为字段赋值,则自动赋予默认值。
#为sex性别字段设置默认值,1表示男,2表示女,3表示保密,不传时候默认为3
CREATE TABLE tbl(id INT(2) UNSIGNED AUTO_INCREMENT PRIMARY KEY,age TINYINT UNSIGNED,sex ENUM('1','2','3') DEFAULT '3');

 向表table中插入一条数据:insert tbl (age) VALUES (18); 我们没并没有给性别赋值。查看表数据,可以看到性别默认被填写了3。

MySQL基础知识(二)——数据表和约束

4.NOT NULL 非空约束

#area地域字段不能为空
CREATE TABLE tbl1(id INT(2) UNSIGNED AUTO_INCREMENT PRIMARY KEY,age TINYINT UNSIGNED,sex ENUM('1','2','3') DEFAULT '3',area varchar(20) NOT NULL);

area地域字段不能为空,所以我们在插入数据时候,必须给area字段赋值,否则会报错:ERROR 1364 (HY000): Field 'area' doesn't have a default value

MySQL基础知识(二)——数据表和约束

同样如果给area赋值NULL也会报这个错误:

MySQL基础知识(二)——数据表和约束

5.FOREIGN KEYp 外键约束

  • 保证数据一致性,完整性;
  • 实现一对一或一对多关系。

创建外键约束的要求:

  • 父表和子表必须使用相同的存储引擎,而且禁止使用临时表;
  • 数据表的存储引擎只能为InnoDB;
  • 外建列和参照列必须具有相似的数据类型。其中数字长度或是否有符号位必须相同,而字符的长度则可以不同;
  • 外键列和参照列必须创建索引,如果外键列不存在索引的话,MySQL将会自动创建索引。

如下,创建两张表,一张省份表,一张城市表,城市表有个外键pid,参照省份表的id列。

#省份表--参照表,也称作父表,id为参照列。
CREATE TABLE provinces(id SMALLINT UNSIGNED PRIMARY KEY AUTO_INCREMENT,pname VARCHAR(20) NOT NULL);
#城市表--子表,pid为外键列。
CREATE TABLE citys(id SMALLINT UNSIGNED PRIMARY KEY AUTO_INCREMENT,cityname VARCHAR(20) NOT NULL,pid SMALLINT UNSIGNED, FOREIGN KEY (pid) REFERENCES provinces(id));

外键约束的参照条件:

CASCADE 从父表删除或更新时,自动删除和更新子表中匹配的行。
SET NULL 从父表删除或更新行时,设置子表中的外键列为NULL,如果使用该选项,必须保证子表外键列没有指定NOT NULL。
RESTRICT 拒绝对父表的更新或删除操作。
NO ACTION 标准SQL的关键字,在MySQL中与RESTRICT相同。
默认 拒绝对父表的更新或删除操作。

用法如下: 

#ON DELETE CASCADE 删除时,自动删除和更新子表中匹配的行。
CREATE TABLE citys1(id SMALLINT UNSIGNED PRIMARY KEY AUTO_INCREMENT,cityname VARCHAR(20) NOT NULL,pid SMALLINT UNSIGNED, FOREIGN KEY (pid) REFERENCES provinces(id) ON DELETE CASCADE);

使用命令SHOW CREATE TABLE tblname;

可以查看到以下信息:

(1)ENGINE=InnoDB引擎是InnoDB。

(2)KEY `pid` (`pid`)。外键列pid已经被自动创建了索引。

(3)CONSTRAINT `citys_ibfk_1` FOREIGN KEY (`pid`) REFERENCES `provinces` (`id`)外键索引被成功创建,外键索引名称为citys_ibfk_1。

MySQL基础知识(二)——数据表和约束

 也可以使用SHOW INDEX FROM tablename;查看表中索引情况。

MySQL基础知识(二)——数据表和约束