写在最前,本篇文章大部分来源于动力节点MySQL入门基础的提炼,并附带自己的理解。主要是为了复习此前学了又忘的数据库。如果同时还能对其他人有所裨益,那就更好不过了。如果有谬误的地方,还请不吝指出。
什么是约束?
在创建表的时候,可以给表中的一些字段加上约束,保证表数据的完整性和有效性
约束作用是为了保证:表中数据有效!
常见约束
非空约束:not null 约束的字段不能为null, 只有列级约束,但可以其他约束联合使用。
唯一性约束:unique 约束字段不能重复
如何使两个字段联合起来唯一?
在字段之后加入unique(字段1,字段2,…) 称为表级约束
想要给多个字段联合添加约束时,需要使用表级约束。
主键约束:primary key
- 如果字段同时被not null,unique约束,则自动变为主键。
- 任何一张表都有主键,没有则表无效
- 主键值是一条记录的唯一标识
- 可以多个字段组成主键,但一个表只能有一个主键
- 不建议使用varchar作为主键,因为主键一般都是定长的
自然主键:主键值是一个自然数,和业务没关系
业务主键:主键值和业务紧密关联,例如银行卡号作为主键
auto_increment
使得字段自增
外键约束:foreign key
添加外键约束,使得字段的值只能来自于其引用表的字段里面的值。
注意:相当于形成了一个父表和子表的关系。
必须父表先存在,才能在子表内有
如果父表没有,那么字表一定也没有
使用方法foreign key(字段1) references 表名(字段2)
示例:
mysql> create table teacher(
-> classno int primary key,
-> name varchar(255));
Query OK, 0 rows affected (0.02 sec)
mysql> create table stu(
-> id int primary key auto_increment,
-> cnt int,
-> foreign key(cnt) references teacher(classno)
-> );
mysql> select * from teacher;
+---------+------+
| classno | name |
+---------+------+
| 100 | wwww |
| 101 | qqqq |
+---------+------+
mysql> insert into stu(cnt) values(102);
ERROR 1452 (23000): Cannot add or update a child row: a foreign key constraint fails (`learn`.`stu`, CONSTRAINT `stu_ibfk_1` FOREIGN KEY (`cnt`) REFERENCES `teacher` (`classno`))
mysql> insert into stu(cnt) values(101);
Query OK, 1 row affected (0.01 sec)
mysql> select * from stu;
+----+------+
| id | cnt |
+----+------+
| 2 | 101 |
+----+------+
提问:
- 外键必须引用主键么? 不一定,但至少具有unique约束
- 外键可以为空么? 可以
检查约束:check (mysql不支持,oracle支持)
重点学前四个
.sql 文件被称为sql脚本文件
编写了大量的sql语句
执行文件时,所有sql语句会全部执行。