SQL之键与约束
1. 约束的概念讲解
在SQL这里所说的约束是一种规则,它不是一个具体的代码或者指令。然后我们创建了键,然后给不同的键添加了不同的规则,用来实现约束。
约束的存在主要解决三大问题,确保数据库数据可靠:
- 防止无效数据:比如禁止在 “年龄” 列插入负数或字符串。
- 避免重复数据:比如确保 “用户 ID” 列不会出现两个相同的编号。
- 维护表间关联:比如确保 “订单表” 中的 “用户 ID”,在 “用户表” 中一定存在。
2. 空属性
我们可以理解为在一些用户注册的时候要求必须填入的部分。
简单来说就是在创建的时候我们可以设置某一个字段不可以为空,然后用户在输入的时候为空了那就报错。
使用方式:null(默认的)和not null(不为空) 我们可以在参数后面添加这个用来表示是否可以为空。
我们看,如果不给a1插入的话,就会报错,因为我们提前设置了要求a1不可以为空。这就是一种约束。

我们查看t1也可以发现在Null这一栏a1写的是NO。

3. 默认值default
这个我们可以理解为比如说在填入自己的信息是默认都是汉族,类似于这种。
default
我们看下面这张表格,如果我们设置了其中一个为default,那么哪怕我们不填入,它也会是1。如果我们往a1里面填入了,那么它就是我们填入的值。

4. 列描述 comment
列描述:comment,没有实际含义,专门用来描述字段,会根据表创建语句保存,用来给程序员或DBA 来进行了解。简单来说就是注释。
我们在创建的时候这么写。

然后我们通过下面这行代码就可以查看到注释信息。

5. 主键
同时当一个字段被确认为主键的时候,那么就意味着它在插入的时候必须被填入,同时也不允许重复。
我们看下面这一张图片,当a1被设置为主键时候,Key这一栏就显示为PRI。如果我们插入两个一样的数给a1,那么就会直接报错。

alter table 表名 add primary key(字段列表)
alter table 表名 drop primary key;
复合主键
在创建表的时候,在所有字段之后,使用primary key(主键字段列表)来创建主键,如果有多个字段
作为主键,可以使用复合主键。在这里的报错条件就是多个字段全部重复。
我们看下面这一张图片,在id和course全部重复的时候,那么就会报错。
下面这行代码是设置复合主键的方式。
mysql> create table tt14( -> id int unsigned,
-> course char(10) comment '课程代码',
-> score tinyint unsigned default 60 comment '成绩',
-> primary key(id, course) -- id和course为复合主键 -> );
Query OK, 0 rows affected (0.01 sec)
6. 自增长
auto_increment:当对应的字段,不给值,会自动的被系统触发,系统会从当前字段中已经有的最大值 +1操作,得到一个新的不同的值。通常和主键搭配使用,作为逻辑主键。
自增长的特点:
任何一个字段要做自增长,前提是本身是一个索引(key一栏有值)
自增长字段必须是整数
一张表最多只能有一个自增长
auto_increment必须在主键或者唯一索引的地方使用。我们看下面这一张图片,如果设置成功的话,我们desc会在Extra的地方显示一个auto_increment。
我们看下面的代码和图片,如果我们一开始a1给了1,那么接下来它就会在这一额基础上进行++,但是我们如果在后面给了100,那么接下来就是在100的基础上进行++。
mysql> insert into t5 (a1,a2) values (1,"a");
Query OK, 1 row affected (0.00 sec)mysql> insert into t5 (a2) values ("a");
Query OK, 1 row affected (0.01 sec)mysql> insert into t5 (a2) values ("a");
Query OK, 1 row affected (0.00 sec)mysql> insert into t5 (a2) values ("a");
Query OK, 1 row affected (0.00 sec)mysql> insert into t5 (a2) values ("a");
Query OK, 1 row affected (0.00 sec)mysql> insert into t5 (a1,a2)values (100,"b");
Query OK, 1 row affected (0.00 sec)mysql> insert into t5 (a2) values ("b");
Query OK, 1 row affected (0.00 sec)mysql> insert into t5 (a2) values ("b");
Query OK, 1 row affected (0.00 sec)

7. 唯一键
一张表中有往往有很多字段需要唯一性,数据不能重复,但是一张表中只能有一个主键:唯一键就可以
解决表中有多个字段需要唯一性约束的问题。
唯一键的本质和主键差不多,唯一键允许为空,而且可以多个为空,空字段不做唯一性比较。
关于唯一键和主键的区别:
我们可以简单理解成,主键更多的是标识唯一性的。而唯一键更多的是保证在业务上,不要和别的信息 出现重复。
其实简单来说唯一键就是为了解决我们在一张表格中不止一个需要去重的地方而设计的。
我们看下面这张图片,它可以达到和主键一样的效果。

8. 外键
外键用于定义主表和从表之间的关系:外键约束主要定义在从表上,主表则必须是有主键约束或unique约束。当定义外键后,要求外键列数据必须在主表的主键列存在或为null。
foreign key (字段名) references 主表(列)
这个比较抽象,我们借用下面这张图来进行说明,foreign key (class_id) references myclass(id)就给两者之间建立了关系。然后现在班级有10和20,那么现在在学生表中插入数据,同时给他的calss_id填入30,那么SQL就会报错。

注意:foreign key (字段名) references 主表(列) 这行要写在创建从表时的时候。
我们看下面这张图片,被关联的主表里面的列要为主键。这样我们就建立好了外键约束。

