文章目录
- 数据库约束
- not null
- unique
- default
- primary key 主键
- foreign key 外键
- 数据库约束实例
- check(了解)
- auto_increment 自增
- 表的设计
数据库约束
not null
unique
default
primary key 主键
- 主键约束,是not null 与 unique 的结合,确保某列的每行的赋值不能为null 并且是唯一的
foreign key 外键
- 外键约束,保证一个表中的数据匹配另一个表中的值参照完整性.
- 一般习惯放到最后
- 外键约束会影响表的删除,例如下面实例的class表被关联,所以他不能被轻易删除
数据库约束实例
mysql> create table class (
-> id int primary key,
-> name varchar(20) not null
-> );
Query OK, 0 rows affected (0.04 sec)
mysql> create table student (
-> id int primary key,
-> name varchar(20) not null,
-> email varchar(20) default 'unknow',
-> QQ varchar(20) unique,
-> classId int , foreign key (classId) references class(id)
-> );
Query OK, 0 rows affected (0.03 sec)
mysql> desc class;
+
| Field | Type | Null | Key | Default | Extra |
+
| id | int(11) | NO | PRI | NULL | |
| name | varchar(20) | NO | | NULL | |
+
2 rows in set (0.02 sec)
mysql> desc student;
+
| Field | Type | Null | Key | Default | Extra |
+
| id | int(11) | NO | PRI | NULL | |
| name | varchar(20) | NO | | NULL | |
| email | varchar(20) | YES | | unknow | |
| QQ | varchar(20) | YES | UNI | NULL | |
| classId | int(11) | YES | MUL | NULL | |
+
5 rows in set (0.00 sec)
check(了解)
- 作为了解,类似java中的枚举,保证列中的值符合指定的条件
- MySQL使用时不报错,但忽略该约束:
create table test_user (
id int,
name varchar(20),
sex varchar(1),
check (sex ='男' or sex='女')
);
auto_increment 自增
- 如果表中没有记录,自增从一开始
- 如果有数据,从上一条记录往下自增
- 插入再删掉数据,自增的值不会重复利用,会按删掉的那条开始自曾
mysql> create table test (
-> id int primary key auto_increment,
-> name varchar(20)
-> );
Query OK, 0 rows affected (0.02 sec)
mysql> insert into test values (null, 'a');
Query OK, 1 row affected (0.01 sec)
mysql> select * from test;
+
| id | name |
+
| 1 | a |
+
1 row in set (0.00 sec)
mysql> delete from test where id = 1;
Query OK, 1 row affected (0.01 sec)
mysql> insert into test values (null, 'a');
Query OK, 1 row affected (0.00 sec)
mysql> select * from test;
+
| id | name |
+
| 2 | a |
+
1 row in set (0.00 sec)
表的设计
一对一
- 一对一设计表就比如人的表与身份证号的表,一个人只能有一个身份证号码,一个身份证号码也只对于着一个表
一对多
- 一对多设计表,就是我上述设计的实例那俩个表,其一个学生只能对应一个班级,但是一个班级可以对应多个学生
多对多
- 多对多设计表就好比学生表和课程表,一个学生可以选多个课程,一个课程也可以被多个学生选择
多对多建表实例
mysql> create table test_student (
-> id int primary key,
-> name varchar(10) default 'unknow'
-> );
Query OK, 0 rows affected (0.03 sec)
mysql> create table test_course (
-> id int primary key,
-> name varchar(20) default 'unknow'
-> );
Query OK, 0 rows affected (0.02 sec)
mysql> create table test_score (
-> studentId int,
-> courseId int,
-> score int,
-> foreign key (studentId) references test_student(id),
-> foreign key (courseId) references test_course(id)
-> );
Query OK, 0 rows affected (0.02 sec)
mysql> desc test_student;
+
| Field | Type | Null | Key | Default | Extra |
+
| id | int(11) | NO | PRI | NULL | |
| name | varchar(10) | YES | | unknow | |
+
2 rows in set (0.00 sec)
mysql> desc test_coures;
ERROR 1146 (42S02): Table 'java_5_27.test_coures' doesn't exist
mysql> desc test_course;
+
| Field | Type | Null | Key | Default | Extra |
+
| id | int(11) | NO | PRI | NULL | |
| name | varchar(20) | YES | | unknow | |
+
2 rows in set (0.00 sec)
mysql> desc test_score;
+
| Field | Type | Null | Key | Default | Extra |
+
| studentId | int(11) | YES | MUL | NULL | |
| courseId | int(11) | YES | MUL | NULL | |
| score | int(11) | YES | | NULL | |
+
3 rows in set (0.00 sec)
插入数据到实例实现多对多
mysql> insert into test_student values (1, 'listen');
Query OK, 1 row affected (0.01 sec)
mysql> insert into test_course values (1, '数学');
Query OK, 1 row affected (0.00 sec)
mysql> insert into test_student values (2, 'Faker');
Query OK, 1 row affected (0.00 sec)
mysql> insert into test_course values (2, '数学');
Query OK, 1 row affected (0.00 sec)
mysql> insert into test_score values(1, 1, 90);
Query OK, 1 row affected (0.00 sec)
mysql> insert into test_score values (1, 2, 99);
Query OK, 1 row affected (0.00 sec)
mysql> insert into test_score values (2, 1, 50);
Query OK, 1 row affected (0.00 sec)
mysql> insert into test_score values (2, 2, 60);
Query OK, 1 row affected (0.00 sec)
mysql> select * from test_student;
+
| id | name |
+
| 1 | listen |
| 2 | Faker |
+
2 rows in set (0.00 sec)
mysql> select * from test_course;
+
| id | name |
+
| 1 | 数学 |
| 2 | 语文 |
+
2 rows in set (0.00 sec)
mysql> select * from test_score;
+
| studentId | courseId | score |
+
| 1 | 1 | 90 |
| 1 | 2 | 99 |
| 2 | 1 | 50 |
| 2 | 2 | 60 |
+
4 rows in set (0.00 sec)