列的属性
简单的查询
查询语句
select * from 表名;
简单的插入
插入数据以行为单位
INSERT INTO 表名(列1, 列2, ...) VALUES(列1的值,列2的值, ...);
也可只指定部分列的值,不过其他列默认值为 null
INSERT INTO 表名(列1) VALUES(列1的值);
批量插入
INSERT INTO 表名(列1,列2, ...) VAULES(列1的值,列2的值, ...), (列1的值,列2的值, ...), (列1的值,列2的值, ...), ...;
属性
默认值
当插入数据时没有定义默认值,则所有默认值都为 NULL;而不想默认值为 NULL 时,可以给列增加 DEFAULT
属性
列名 列的类型 DEFAULT 默认值
mysql> create table test_table(
-> name varchar(5),
-> age int default 18);
Query OK, 0 rows affected (0.72 sec)
然后插入一条数据
insert into test_table(name) values('Mondo');
插入数据并没有设置 age
列的值,查看 test_table
表数据,可以看出默认值变成了 18
mysql> select * from test_table;
+-------+------+
| name | age |
+-------+------+
| Mondo | 18 |
+-------+------+
1 row in set (0.00 sec)
mysql>
NOT NULL 属性
设置列 NOT NULL 属性可以让列不能设置 NULL
值
mysql> create table test_table(
-> name varchar(5) not null,
-> age int default 18);
Query OK, 0 rows affected (0.71 sec)
这样 name
值不能被设置默认值 NULL
mysql> insert into test_table(age) values(20);
ERROR 1364 (HY000): Field 'name' doesn't have a default value
mysql>
可以看到没有设置默认值,就会报错
主键
候选键:通过表中的某一列或某些列确认一条记录,那么这个列或这些列叫做候选键
比如 stundet_info
表中可以根据学号来确认某个学生的唯一记录,或者 student_score
根据 学号和 科目来确认唯一的成绩记录,所以学号和科目这个组合就是学生成绩表的候选键
一张表可以存在多个候选键,选择其中一个作为表的主键。
- 一张表只存在一个主键
- 主键值不可重复,是唯一值
- 默认 NOT NULL 属性,必填
声明方法
- 如果是单个列设为主键,可以直接在列后定义
primary key
CREATE TABLE student_info (
number INT PRIMARY KEY,
name VARCHAR(5),
sex ENUM('男', '女'),
id_number CHAR(18),
department VARCHAR(30),
major VARCHAR(30),
enrollment_time DATE
);
- 也可以单独定义
PRIMARY KEY (列名1, 列名2, ...)
CREATE TABLE student_info (
number INT,
name VARCHAR(5),
sex ENUM('男', '女'),
id_number CHAR(18),
department VARCHAR(30),
major VARCHAR(30),
enrollment_time DATE,
PRIMARY KEY (number)
);
对于多个列组合为主键的情况下,只能使用单独定义
CREATE TABLE student_score (
number INT,
subject VARCHAR(30),
score TINYINT,
PRIMARY KEY (number, subject)
);
UNIQUE 属性
对于不是主键的其他候选键,也可以添加约束属性,添加方式和 primary key
类似
CREATE TABLE student_info (
number INT PRIMARY KEY,
name VARCHAR(5),
sex ENUM('男', '女'),
id_number CHAR(18) UNIQUE,
department VARCHAR(30),
major VARCHAR(30),
enrollment_time DATE
);
多个键名必须单独声明
CREATE TABLE student_info (
number INT,
name VARCHAR(5),
sex ENUM('男', '女'),
id_number CHAR(18),
department VARCHAR(30),
major VARCHAR(30),
enrollment_time DATE,
PRIMARY KEY (number),
UNIQUE KEY (id_number)
);
主键与 UNIQUE 区别
- 一张表只能出现唯一主键,但可以出现多个 UNIQUE 约束
- 主键列不能存储 NULL 值,UNIQUE 约束可以存放 NULL 值
外键
如果A表中的某个列或者某些列依赖与B表中的某个列或者某些列,那么就称A表为子表,B表为父表。子表和父表可以使用外键来关联起来。上边例子中 student_score
表的 number
列依赖于 student_info
的 number
列,所以 student_info
就是一个父表,student_score
就是子表。我们可以在 student_score
的建表语句中来定义一个外键
CREATE TABLE student_score (
number INT,
subject VARCHAR(30),
score TINYINT,
PRIMARY KEY (number, subject),
CONSTRAINT FOREIGN KEY(number) REFERENCES student_info(number)
);
这样,在对 student_score
表插入数据的时候,MySQL 都会为我们检查一下插入的学号是否能在 student_info
表中找到,如果找不到则会报错
AUTO_INCREMENT属性
简称自增,如果把一个列是类型是整数类型或浮点数类型,这个列就可以设置 AUTO_INCERMENT 属性;当我们设置该属性后,插入记录时,没有指定该列的值时,或者将该列的值显式地指定为 NULL 或者 0,那么新插入的记录在该列上的值就是当前该列的最大值加 1 后的值
mysql> CREATE TABLE first_table (
-> id INT UNSIGNED AUTO_INCREMENT PRIMARY KEY,
-> first_column INT,
-> second_column VARCHAR(100) DEFAULT 'abc'
-> );
Query OK, 0 rows affected (0.01 sec)
mysql>
定义列自增属性时,需要注意:
- 一张表最多只能设置一个自增属性列
- 具有 AUTO_INCREMENT 属性的列必须建立索引。主键和具有 UNIQUE 属性的列会自动建立索引。
- 拥有 AUTO_INCREMENT 属性的列就不能再通过指定 DEFAULT 属性来指定默认值。
- 一般拥有 AUTO_INCREMENT 属性的列都是作为主键的属性,来自动生成唯一标识一条记录的主键值。
列的注释
在建表语句的末尾可以添加 COMMENT 语句来给表添加注释,其实我们也可以在每一个列末尾添加 COMMENT 语句来为列来添加注释
CREATE TABLE first_table (
id int UNSIGNED AUTO_INCREMENT PRIMARY KEY COMMENT '自增主键',
first_column INT COMMENT '第一列',
second_column VARCHAR(100) DEFAULT 'abc' COMMENT '第二列'
) COMMENT '第一个表';
标识符的命名
像数据库名、表名、列名、约束名称或者我们之后会遇到的别的名称,这些名称统统被称为标识符。
- 名称不能是数字,数据库自己使用数字,不能有效的查询到
- 名称中不能有空白符,如果存在会被当做两个词处理,造成歧义
- 名称中不能使用 MySQL 保留字
但是如果你坚持要使用有歧义的名词,可以使用反引号 ```` 来将定义的名称扩起来,这样 MySQL 的服务器就能检测到你提供的是一个名称而不是别的什么东西
CREATE TABLE `first_table` (
`id` int UNSIGNED AUTO_INCREMENT PRIMARY KEY,
`first_column` INT,
`second_column` VARCHAR(100) DEFAULT 'abc'
);