目录
【MySQL进阶之路】MySQL基础——从零认识MySQL-CSDN博客
🤗个人主页:东洛的克莱斯韦克-CSDN博客
🔥空属性
null 表示空的, not null表示非空。
null 不参与运算
select 1+null;
数据库默认字段是可以为空的,如果在业务中不允许字段的值为空,就需要加上非空约束。
场景
创建一个班级表,包含班级名和班级所在的教室。 站在正常的业务逻辑中: 如果班级没有名字,你不知道你在哪个班级 如果教室名字可以为空,就不知道在哪上课
建表时不加非空约束
create table class(
name varchar(10),
room char(10)
);
那么可以插入空值
insert into class() values();
建表时加上非空约束
create table class1(
name varchar(10) not null,
room char(10) not null
);
插入空值时会报错
🔥默认值
默认值:某一种数据会经常性的出现某个具体的值,可以在一开始就指定好,在需要真实数据的时候, 用户可以选择性的使用默认值。
用 default 字段设置默认值
场景
在用户注册账号时,我们默认用户的性别是未知,当用户确定选择男或女是在进行更改。
create table if not exists acount(
id varchar(20),
gender char(2) default '未知'
);
默认值的设置会受字符集的影响,小编在配置文件中设置的字符集是utf8mb4,在建表时出现了如下报错
更改当前数据库的字符集
alter database db2 character set utf8;
建表成功,只插入id字段的数据看效果
insert into acount(id) values('12345');
🔥非空约束和默认值
我们用如下SQL语句测试
create table test(
t1 char(2) null default 'a',
t2 char(2) not null,
t3 char(2) not null default 'b'
);
insert into test (t1,t2,t3)values(' ','c',' ');
结果如下
这说明,不管我有没有非空约束和默认值,只要我插入了合法数据,就按插入的数据来。
insert into test (t2)values('d');
结果如下
这说明,不管我有没有非空约束,只要我有默认值,如果我没插入数据,就按我默认的值来
insert into test ()values();
结果如下
报错也很明显,如果我有非空约束,但我没有默认值,如果我没插入数据,就会报错。
🔥列描述
列描述:comment,没有实际含义,专门用来描述字段,会根据表创建语句保存,用来给程序员或DBA 来进行了解。
create table tt12 (
name varchar(20) not null comment '姓名',
age tinyint unsigned default 0 comment '年龄',
sex char(2) default '男' comment '性别'
);
desc 看不到注释信息
show create table 可以查看注释信息
🔥zerofill
用如下SQL语句创建一张表
create table test1(
age int unsigned
);
show create table test1 \G;
可以看到int(10),这个代表什么意思呢?整型不是4字节码?这个10又代表什么呢?其实没有zerofill这个 属性,括号内的数字是毫无意义的。
insert into test1 values(1);
但是对列添加了zerofill属性后,显示的结果就有所不同了。修改test1表的属性
alter table test1 change age age int unsigned zerofill;
这次可以看到a的值由原来的1变成0000000001,这就是zerofill属性的作用,如果宽度小于设定的宽度,自动填充0。要注意的是,这只是最后显示的结果,在MySQL中实际存储的还是1。为什 么是这样呢?我们可以用hex函数来证明。
可以看出数据库内部存储的还是1,0000000001只是设置了zerofill属性后的一种格式化输出而已。