MySQL自动编号(主键自增):AUTO_INCREMENT
自动编号,必须与主键组合使用;默认情况,起始值为1,每次的增量为1
1.创建一个主键自增的数据表tb2:CREATE TABLE tb2(id SMALLINT UNSIGNED AUTO_INCREMENT PRIMARY KEY,username VARCHAR(20) NOT NULL);
2.查看表的数据结构:SHOW COLUMNS FROM tb2;
3.为部分字段赋值:INSERT tb2(username) VALUES('Tom');
INSERT tb2(username) VALUES('John');
4.主键自增不用手动赋值
MySQL主键约束:PRIMARY KEY
主键保证记录的唯一性
主键自动为NOT NULL
每张数据表只能有一个主键
在不设定主键自增的情况下,主键约束的字段可以赋值,但不可重复
MySQL唯一约束:UNIQUE KEY
唯一约束可以保证记录的唯一性
唯一约束的字段可以为 NULL
每张数据表可以存在多个唯一约束
创建id为主键自增,username为唯一约束的数据表:
CREATE TABLE tb3(id SMALLINT UNSIGNED AUTO_INCREMENT PRIMARY KEY,username VARCHAR(20) NOT NULL UNIQUE KEY,age TINYINT UNSIGNED);
INSERT tb3(username,age) VALUES('Tom',22); --正确
INSERT tb3(username,age) VALUES('Tom',25); --错误
MySQL默认约束:DEFAULT
1.当插入数据时,如果没有明确为字段赋值,则会自动赋予默认值
创建性别为默认约束的数据表:
CREATE TABLE tb4(id SMALLINT UNSIGNED AUTO_INCREMENT PRIMARY KEY,username VARCHAR(20) NOT NULL UNIQUE KEY,sex ENUM('1','2','3') DEFAULT '3');
MySQL外键约束:FOREIGN KEY
1. 保持数据的一致性,完整性
2. 实现一对一 或 一对多 关系
3. 外键约束的要求:
3.1 父表(子表参照的表)和子表(具有外键列的表)必须使用相同的存储引擎,并且禁止使用临时表
3.2 数据表的存储引擎只能为InnoDB
3.3 外键列和参照列必须有相似的数据类型,其中数字的长度 或 是否有符号位 必须相同.而字符的长度可以不同.
3.4 外键列和参照列必须创建索引,如果外键列不存在索引,MySQL将自动创建索引.参照列不存在索引,MySQL不会创建索引.
4. 编写数据表默认的存储引擎:
MySQL配置文件:
default-storage-engine=INNODB(默认的存储引擎就是INNODB)
5. 创建两张数据表
5.1 父表:
CREATE TABLE provinces(id SMALLINT UNSIGNEDAUTO_INCREMENT PRIMARY KEY,pname VARCHAR(20) NOT NULL); --省份数据表
5.2 子表:
CREATE TABLE users(id SMALLINT UNSIGNED PRIMARY KEY AUTO_INCREMENT,username VARCHAR(20) NOT NULL,pid BIGINT,FOREIGN KEY (pid) REFERENCES provinces (id));
--用户数据表,外键关联省份表(报错,不满足 外键约束的要求:数字的长度必须相同)
CREATE TABLE users(id SMALLINT UNSIGNED PRIMARY KEY AUTO_INCREMENT,username VARCHAR(20) NOT NULL,pid SMALLINT,FOREIGN KEY (pid) REFERENCES provinces (id));
--用户数据表,外键关联省份表(报错,不满足 外键约束的要求:是否有符号位必须相同)
CREATE TABLE users(id SMALLINT UNSIGNED PRIMARY KEY AUTO_INCREMENT,username VARCHAR(20) NOT NULL,pid SMALLINT UNSIGNED,FOREIGN KEY (pid) REFERENCES provinces (id));
--用户数据表,外键关联省份表(正确,满足外键约束的要求)
5.3 创建表是否存在索引:(主键在创建时,自动创建索引)
SHOW INDEXES FROM provinces; --显示索引
SHOW INDEXES FROM provinces\G; --显示索引,以列表形式呈现
6. 外键约束的参照操作
6-1. CASCADE:从父表删除或更新 且 自动删除或更新子表中匹配的列
CREATE TABLE user1(id SMALLINT UNSIGNED PRIMARY KEY AUTO_INCREMENT,username VARCHAR(20) NOT NULL,pid SMALLINT UNSIGNED,FOREIGN KEY (pid) REFERENCES provinces (id)ON UPDATE CASCADE ON DELETE CASCADE);
DELETE FROM provinces WHERE id=2;
mysql> SELECT * FROM user1;
+----+----------+------+
| id | username | pid |
+----+----------+------+
| 1 | Tom | 2 |
| 3 | John | 1 |
| 4 | Rose | 2 |
+----+----------+------+
3 rows in set (0.00 sec)
mysql> DELETE FROM provinces WHERE id=2;
Query OK, 1 row affected (0.02 sec)
mysql> SELECT * FROM user1;
+----+----------+------+
| id | username | pid |
+----+----------+------+
| 3 | John | 1 |
+----+----------+------+
1 row in set (0.00 sec)
mysql> SELECT * FROM provinces;
+----+-------+
| id | pname |
+----+-------+
| 1 | A |
| 3 | C |
+----+-------+
2 rows in set (0.00 sec)
mysql>
6-2. SET NULL:从父表删除或更新行,并设置子表中的外键列为NULL.如果使用该选项,必须保证子表列没有指定NOT NULL.
6-3. RESTRICT:拒绝对父表的删除或更新操作
CREATE TABLE user1(id SMALLINT UNSIGNED PRIMARY KEY AUTO_INCREMENT,username VARCHAR(20) NOT NULL,pid SMALLINT UNSIGNED,FOREIGN KEY (pid) REFERENCES provinces (id) ON UPDATE RESTRICT ON DELETE RESTRICT);
DELETE FROM provinces WHERE id=2;
#删除父表失败
6-4. NO ACTION:标准SQL的关键字,在MySQL中与RESTRICT相同
MySQL的表级约束和列级约束
1. 对一个数据列建立的约束,称为列级约束
2. 对多个数据列建立的约束,称为表级约束
3. 列级约束既可以在列定义时声明,也可以在列定义后声明;表级约束只能在列定义后声明。
注:NOT NULL,DEFAULT 只有列级约束; PRIMARY KEY,UNIQUE KEY,FOREIGN KEY 都可存在表级 或 列级 约束