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

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

结束。

相关推荐
&不羁之风&1 小时前
从 MySQL 到 MongoDB:80 万系统日志(sys_log)平滑迁移完整实战(含 Windows 环境 mongoimport 安装与避坑)
mysql·mongodb
AI职业加油站2 小时前
数据要素价值释放年:大数据治理工程师,站上职业新风口
人工智能·学习·职场和发展·数据分析·职场发展
这个DBA有点耶3 小时前
InnoDB页结构深入:页分裂、页合并、填充因子——B+树底层机制全解析
数据库·mysql·架构
啄缘之间3 小时前
1.【SVA】什么是SVA?
经验分享·学习·测试用例·verilog·sva
山岚的运维笔记3 小时前
mysql 专业笔记 -- 第 36 章:MySQL 管理
运维·数据库·笔记·后端·mysql·oracle·dba
sunoo-2294 小时前
【嵌入式裸机开发Day04】i.MX6ULL 蜂鸣器驱动详解:从引脚地址查找到代码实现全流程
arm开发·单片机·嵌入式硬件·学习·串口·裸机
Purple Coder4 小时前
stm32
学习
边境悍匪4 小时前
蜗牛学苑 Java 智能体学习 Day45|Knife4j+SpringBoot3、书城项目整合 MyBatis 思维导图复盘
java·开发语言·vue.js·学习·spring
爱吃苹果的日记本4 小时前
离散数学第五课
学习·离散数学
霸道流氓气质4 小时前
SQL 里的 AND / OR 优先级陷阱:一个括号引发的“数据越界“
mysql