|
|
@ -240,6 +240,179 @@ ALERT TABLE 表名 操作1, 操作2, ...; |
|
|
|
|
|
|
|
|
|
|
|
# 第六章 列的属性 |
|
|
|
# 第六章 列的属性 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
## 6.1 简单的查询和插入语句 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
### 6.1.1 简单的查询语句 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
```sql |
|
|
|
|
|
|
|
SELECT * FROM table; |
|
|
|
|
|
|
|
``` |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
### 6.1.2 简单的插入语句 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
```sql |
|
|
|
|
|
|
|
-- 如果没有指明某个字段的值,即为默认值 |
|
|
|
|
|
|
|
INSERT INTO 表名(列1, 列2, 列3) VALUES(列1值, 列2值, 列3值); |
|
|
|
|
|
|
|
``` |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
### 6.1.3 批量插入 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
```sql |
|
|
|
|
|
|
|
INSERT INTO 表名(列1, 列2, 列3) VALUES(列1值, 列2值, 列3值), (列1值, 列2值, 列3值), (列1值, 列2值, 列3值); |
|
|
|
|
|
|
|
``` |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
## 6.2 列属性 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
### 6.2.1 默认值 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
```sql |
|
|
|
|
|
|
|
CREATE TABLE table_name ( |
|
|
|
|
|
|
|
first_column INT DEFAULT '0' |
|
|
|
|
|
|
|
); |
|
|
|
|
|
|
|
``` |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
### 6.2.2 NOT NULL |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
`列名 列类型 NOT NULL` |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
### 6.2.3 主键 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
```sql |
|
|
|
|
|
|
|
-- 单字段主键 |
|
|
|
|
|
|
|
CREATE TABLE table_name ( |
|
|
|
|
|
|
|
first_column INT PRIMARY KEY |
|
|
|
|
|
|
|
); |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
CREATE TABLE table_name ( |
|
|
|
|
|
|
|
first_column INT PRIMARY KEY, |
|
|
|
|
|
|
|
PRIMARY KEY (first_column) |
|
|
|
|
|
|
|
); |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
-- 多字段主键 只能这样设置 |
|
|
|
|
|
|
|
CREATE TABLE table_name ( |
|
|
|
|
|
|
|
first_column INT, |
|
|
|
|
|
|
|
last_column INT, |
|
|
|
|
|
|
|
PRIMARY KEY (first_column, last_column) |
|
|
|
|
|
|
|
); |
|
|
|
|
|
|
|
``` |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
### 6.2.4 UNIQUE约束 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
- 希望有其他列或列组合存储值唯一 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
```sql |
|
|
|
|
|
|
|
-- 单个字段约束 |
|
|
|
|
|
|
|
CREATE TABLE table_name ( |
|
|
|
|
|
|
|
first_column INT PRIMARY KEY, |
|
|
|
|
|
|
|
next_column INT UNIQUE , |
|
|
|
|
|
|
|
last_column INT |
|
|
|
|
|
|
|
); |
|
|
|
|
|
|
|
-- 多个字段约束 |
|
|
|
|
|
|
|
CREATE TABLE table_name ( |
|
|
|
|
|
|
|
first_column INT PRIMARY KEY, |
|
|
|
|
|
|
|
next_column INT, |
|
|
|
|
|
|
|
last_column INT, |
|
|
|
|
|
|
|
UNIQUE KEY 约束名 (next_column, last_column) |
|
|
|
|
|
|
|
); |
|
|
|
|
|
|
|
CREATE TABLE hutao.new_table ( |
|
|
|
|
|
|
|
product_id INT PRIMARY KEY, |
|
|
|
|
|
|
|
product1 VARCHAR(50), |
|
|
|
|
|
|
|
product2 VARCHAR(20), |
|
|
|
|
|
|
|
product3 VARCHAR(50), |
|
|
|
|
|
|
|
product4 VARCHAR(50), |
|
|
|
|
|
|
|
product5 VARCHAR(50), |
|
|
|
|
|
|
|
product6 VARCHAR(50), |
|
|
|
|
|
|
|
UNIQUE KEY key1 (product1, product2), |
|
|
|
|
|
|
|
UNIQUE KEY key2 (product5, product6) |
|
|
|
|
|
|
|
); |
|
|
|
|
|
|
|
``` |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
注意: |
|
|
|
|
|
|
|
- 一张表只能有一个`主键`,但是可以有多个`UNIQUE`约束 |
|
|
|
|
|
|
|
- 主键不允许为`NULL`,但是`UNIQUE`可以存,并且允许存在多个,`NULL`代表没有填写 |
|
|
|
|
|
|
|
- 如果未定义主键,mysql会默认将第一个出现的`NOT NULL UNIQUE`设置为主键 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
### 6.2.3 外键 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
学生成绩表中携带了学生信息表中的学生id字段,如果学生成绩表中的学生id在学生信息表中不存在,那么此条学生成绩为无意义数据,为避免这种问题,设立外键。 |
|
|
|
|
|
|
|
以上学生信息表被称为主表,学生成绩表被称为子表,子表学生成绩表中的学生id为学生成绩表的外键,外键必须是主表的索引,主键和UNIQUE约束自动成索引 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
- 写法1(建议):`CONSTRAINT [外键名] FOREIGN KEY (字段1, 字段2, 字段3) REFERENCES 主表名(字段1, 字段2, 字段3)` |
|
|
|
|
|
|
|
- 写法2(简写):`FOREIGN KEY [外键名] (字段1, 字段2, 字段3) REFERENCES 主表名(字段1, 字段2, 字段3)` |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
```sql |
|
|
|
|
|
|
|
CREATE TABLE student_score ( |
|
|
|
|
|
|
|
score_id INT PRIMARY KEY COMMENT '学生成绩表主键', |
|
|
|
|
|
|
|
student_id INT COMMENT '学生ID', |
|
|
|
|
|
|
|
score_number INT COMMENT '学生成绩', |
|
|
|
|
|
|
|
CONSTRAINT FOREIGN KEY (student_id) REFERENCES student_info(student_id) |
|
|
|
|
|
|
|
) |
|
|
|
|
|
|
|
``` |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
### 6.2.4 自增 AUTO_INCREMENT |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
- 使用整型或浮点型 |
|
|
|
|
|
|
|
- 用法`列名 列类型 AUTO_INCREMENT` |
|
|
|
|
|
|
|
- INSERT时将自增列设置为NULL时会自动插入自增值 |
|
|
|
|
|
|
|
- NO_AUTO_VALUE_ZERO是默认不开启的,将0插入自增列也是自增值 |
|
|
|
|
|
|
|
- 如果INSERT显式的插入新的自增值,下一个默认自增值是在显式自增值的基础上增长的 |
|
|
|
|
|
|
|
- 一个表最多只能有一个自增列 |
|
|
|
|
|
|
|
- 自增列必须为索引,主键和UNIQUE默认为索引 |
|
|
|
|
|
|
|
- 自增列不能设置默认值DEFAULT |
|
|
|
|
|
|
|
- 自增列一般作为主键 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
### 6.2.8 列注释 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
`列名 数据类型 COMMENT '注释'` |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
### 6.2.9 ~~显示宽度和ZEROFILL~~ MYSQL8.0.17不推荐 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
- ZEROFILL作用是无符号数字补零 |
|
|
|
|
|
|
|
- 没有显式说明UNSIGNED MYSQL会在建表的时候补上 |
|
|
|
|
|
|
|
- 不同的整数类型默认显示宽度不同 |
|
|
|
|
|
|
|
- 这不会影响存储 |
|
|
|
|
|
|
|
- |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
`列名 数据类型(显示宽度) UNSIGNED ZEROFILL` |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
```sql |
|
|
|
|
|
|
|
CREATE TABLE zerofille_table ( |
|
|
|
|
|
|
|
id INT AUTO_INCREMENT , |
|
|
|
|
|
|
|
number UNSIGNED INT(5) ZEROFILL |
|
|
|
|
|
|
|
) |
|
|
|
|
|
|
|
``` |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
## 6.3 查看表结构时的列属性 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 表头 | 值 | 说明 | |
|
|
|
|
|
|
|
|---------|---------|-----------| |
|
|
|
|
|
|
|
| Null | No/Yes | 是否允许为Null | |
|
|
|
|
|
|
|
| Key | PRE/UNI | 标记键的信息 | |
|
|
|
|
|
|
|
| Default | | 默认值 | |
|
|
|
|
|
|
|
| Extra | | 额外信息,如自增列 | |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
## 6.4 标识符的命名 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
- 各种名字不能以空格结尾 |
|
|
|
|
|
|
|
- 可以使用``将带空格的或纯数字包起来 ,但是不建议使用这两个 |
|
|
|
|
|
|
|
- 不能用保留字如DESCRIBE |
|
|
|
|
|
|
|
- 按照C/C++标准来,建议用下划线区分 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
# 第七章 简单查询 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|