第 5 章 · 第三节
UNIQUE 约束
UNIQUE 保证这一列(或几列合起来)不出现重复值。

分清楚
| 两种写法 | 写在哪 |
|---|---|
| 列约束 | 跟在字段后面 |
| 表约束 | 写在所有字段之后 |
记牢它三条
- 一张表可以有多个
- 允许留空
- 空值不算重复
重 点
表约束能把几列绑在一起,比如姓名加性别合起来不重复。
UNIQUE 保证这一列(或几列合起来)不出现重复值。

| 两种写法 | 写在哪 |
|---|---|
| 列约束 | 跟在字段后面 |
| 表约束 | 写在所有字段之后 |
表约束能把几列绑在一起,比如姓名加性别合起来不重复。
同一件事,列约束和表约束两种写法都能办到。

MySQL 认为空值不等于空值,所以两个空值不算重复。
把姓名设成唯一,以后会碰上什么麻烦?
主键是每一行的身份证,不能空也不能重。

| 两种写法 | 用在哪 |
|---|---|
| 列约束 | 单个字段当主键 |
| 表约束 | 几个字段合成主键 |
一张表只能有一个主键,但主键可以由好几个字段合起来当。
学生表拿学号当主键,选课表拿学号加课程号。

两个都保证不重复,差别在三处。

| 比什么 | 主键 | 唯一 |
|---|---|---|
| 有几个 | 只能一个 | 可以多个 |
| 能不能空 | 一定不空 | 可以为空 |
同一列不要既设主键又设唯一,主键本身已经包含了这两条。
外键把两张表连起来,管住引用的正确性。

主表那一行被删或被改,从表有四种反应。

| sno | sn |
|---|---|
| s1 | 张三 |
| s2 | 李四 |
| sno | cno |
|---|---|
| s1 | c1 |
| s1 | c2 |
| s2 | c1 |
| 策略 | 主表删了怎么办 |
|---|---|
| RESTRICT | 有人引用就不让删 |
| CASCADE | 从表跟着一起删 |
| SET NULL | 从表外码改成空 |
| NO ACTION | 和 RESTRICT 一样 |
不写就是 RESTRICT,先删从表再删主表最稳妥。
选课表两个外键,一个指学生表,一个指课程表。

CHECK 给字段划一个合理范围,超了就不让进。

给 score 加一句 CHECK,成绩就再也超不了 100。

起了名字,以后 DROP CONSTRAINT 才找得到它。
写在所有字段后面的叫表约束,跟在字段后面的叫列约束。
成绩允许加分到 120,这句 CHECK 该改成什么?