MySQL学习记录——유 表的约束

文章目录


1、了解

只有数据类型的约束肯定不够,mysql还有表的约束来进而保证数据合法性。约束是通过技术手段倒逼程序员插入正确数据,凡是能插进mysql的数据,都是符合数据约束的。约束能够保证数据的完整性和可预期性。

2、空属性

默认值为null,另外一个值是not null,也就是不为空。null在mysql中表示没有。null不参与计算,如果是'',则表示空字符串,也可以写成"",两者在mysql中都是字符串,这时候就是有而不是没有。设置not null就会倒逼着让这列数据必须不为空,必须得有数据。




即使第2个位置写上NULL也不行,因为是not null。not null在刚开始时缺省值为NULL,也就是默认值。

3、默认值default

缺省值default,可以自己设定,不设定就是NULL。


如果一个列是not null的,那么我们插入NULL肯定不行,会报错not null;如果不插入,且这个列也没设置默认值的话,会报默认值错,这两个报错是不同的。not null和default是互补的。

插入的数据要么是NULL,要么是合法数据;用户忽略这一列时,使用默认值就无事,没有默认值就报错。所以mysql对字段默认是由default,可以为NULL。

not null和default一般不需要同时出现,因为default本身有默认值,不会为空。

4、列描述comment就是注释,desc看不到,show能看到。

5、zerofill

int默认后面有个10。修改一下表的属性。

不加not null就会变成可为空了,因为modif是覆盖,所以还是要加上not null。

此时b中的数据已经改变了

b中的两个数字每个都是10个数字,所以zerofill就是在长度不够时填充0。

可以让b以16进制显示

select a, hex(b) from t11;

int括号内的数字配合zerofill,意思就是数字的个数不够括号内的数,前面就补零,够了或者超过就正常显示。

int无符号是默认10位,有符号是11位,因为int类型有符号的范围是负2的31次方 ~ 2的31次方减1,无符号则是2的32次方减1,无论是哪个,10个位置都足够表示了,有符号多1位是符号位。

zerofill不影响存储,只影响显示。

6、主键

用主键修饰的一列数据不能为空,不能重复。一个表只能有一个主键,主键所在的列通常是整数类型。

Key里会设置成PRI,Null那里也是NO。


修改是可以的

改变主键的方法除了创建时添加,还有别的办法。

alter table 表名 drop primary key; (去掉主键约束)

alter table 表名 add primary key(列名); (建好表后添加主键)

添加主键前表里不能由同样的列名,要不会报错。删除时可以这样写

delete from 表名 where 列名=''; (按照列名不重复的来删)

添加后desc和show都能看到主键。

主键可以被添加到一列或者多列,添加到多列,多列数据就是复合数据。

这时候可以让其中一列出现重复数据,但是多列不能同时重复,即使不属于复合数据的列的数据和之前插入的不同。

7、自增长auto_increment

必须与主键搭配使用,一个表只有一个自增长,自增长字段必须是整数。

自增长会帮用户管理插入的数据,下图体现了自增长,自增长从当前列最大的数字开始边插入边增长。

当然,因为有主键,不能有重复的,所以像上图那样,插入同一个id的肯定错误。

可以看出来,show里写着49,也就是下一个id,可以用这个命令获取,得到的结果加1就是show里的id。

select last_insert_id();

也可以手动改变。

8、唯一键

unique。

错误出现在id列,也就是有唯一键的列。不过如果是唯一键的列可以为空,也就是NULL可以有多个。

主键和唯一键并不是互相冲突,选定哪些为主键并不妨碍要保证其它列的唯一性;主键不允许为空,唯一键允许为空;主键是在整个表中要标定的唯一,唯一键则是保证该列的唯一;主键体现在标识唯一性,唯一键保证业务唯一。

也可以让唯一键不为空,加上not null就行。

9、外键

外键体现在表跟表之间的关联和约束。


可以看到,有个classid是3的,虽然不符合要求,但也能插入,这是不合理的;另一个例子就是删除class的id1,student也不受影响,但也不合理。这部分的逻辑可用程序员来操控,但也需要数据库这里来报错警告程序员。上面student的class_id和class的id之间用外键来约束。

重新创建一下


MUL就是外键约束。

当然删除已有数据的也不行,删掉不存在数据的,比如id=47,就没问题。

show一下可以看到外键默认名字

CONSTRAINT student_ibfk_1

也可以自定义名字,这里就不写了。

结束。

相关推荐
ooo-p5 分钟前
FPGA学习篇——Verilog学习之“流水灯”
学习·fpga开发
Smile_微笑15 分钟前
恢复 MySQL 服务(Docker 环境专用)
mysql·adb·docker
代码游侠19 分钟前
学习笔记——嵌入式系统通信基础及串口开发
运维·arm开发·笔记·单片机·嵌入式硬件·学习
卜锦元22 分钟前
Docker Compose 部署 MySQL 5.7(生产级实践方案)
数据库·mysql·adb·docker
小袁顶风作案28 分钟前
leetcode力扣——452. 用最少数量的箭引爆气球
学习·算法·leetcode·职场和发展
\xin31 分钟前
SQL 注入、文件上传绕过、MySQL UDF 提权、SUID 提权、Docker 逃逸,以及 APT 持久化技术渗透测试全流程第二次思路
sql·mysql·docker·容器·渗透测试·json·漏洞
2501_9423264436 分钟前
脑科学高效记忆法让学习变轻松
学习
cocodameyou13241 分钟前
从能量阻滞到流动:解码“被动学习”背后的家庭动能重构逻辑
笔记·学习·其他·百度·微信·重构·课程设计
醇氧1 小时前
Spring WebFlux 学习
java·学习·spring
烤麻辣烫1 小时前
23种设计模式(新手)-9单例模式
java·开发语言·学习·设计模式·intellij-idea