表的约束
空属性
- 两个值:null和not null,默认字段都是空,但是实际中尽可能保证字段非空。
- not null表示此列不允许为空,必须做数据插入。
将age设置为not null,所以在插入数据时,age必须有数据,否则就会报错。
默认值
- 如果某一属性,经常性出现,可以在一开始就指定数据;
- 默认值配合not null一起使用;
- set和enum不允许设置默认值
age设置为非空,默认为0;sex默认设置为“男”。
列描述
comment 仅作为描述列的作用,没有实际含义,要查看当前表的描述信息,使用show create table table_name
查看。
需要注意的是comment并不但能同于注释,注释只有在创建的时候能看到。
自动填充名
- 如果某一列数值列规定了zerofill,则自动把此列变为无符号列;
- 规定了zerofill的数值列,如果数据长度没有达到规定长度,则在数据前自动填充0
主键
- 主键用于唯一约束字段数据,使用主键约束的字段,不能为空,不能重复;
- 一张表中只能有一个主键,但是可以是几列一起构成复合主键;
- 单主键所在的列为整数数据类型
a. 设置id为主键
b. 设置name和宿舍为复合主键
c. 创建表以后添加主键或删除主键
注意:要添加为主键的字段已存在的数据,必须不能为空,不能重复。
自增长
- 任何一个字段要做自增长,其本身必须是索引(key一栏必须有值)
- 自增长必须为整数;
- 一张表有且只能有一个自增长;
- 一般与主键配合使用 id+auto_increment:逻辑主键
注意:指定自增数值后,以后的自增以此为基础;删除指定列后,还是以最大值为基础自增。
唯一键
- 唯一键允许为空,但是不能重复,一张表可以有多个字段设置唯一;
- 唯一键解决表中多个字段需要唯一性约束的问题
注意: - null是不做比较的,可以允许有多个null;
- 这里id的类型是char类型,但是是可以输入整数的;反过来,如果id类型是int类型,那么输入的字符串如果是数字,就可以插入成功,如果不是,就会报错。
表的增删改
1. 增加
insert into table[(column[,column...])]
values (value [,value...]);
表的增加操作,我们之前一直在使用,在此不再举例,只说明几点需要注意的:
1. 插入的数据应与字段的数据类型相同;
2. 数据的大小应在规定的范围内,不能把一个长度为80的字符串插入到长度为40的列中;
3. 在values中列出的数据位置必须与被加入的列位置相对应,即顺序不能反;
4. 字符和日期类型应该包含在单引号中;
在插入数据的时候,如果主键对应的值已经存在,那么就会插入失败,我们可以选择性的进行处理:
1. 更新操作
insert into 表名(字段列表) values(值列表) on duplicate key update 字段=新值;
将id为1对应的name由a更新为c
2. 替换操作
replace into 表名(包含字段) values(值列表);
替换操作实际上是先删除这一行,然后再插入,因此操作成功后,显示的是2 rows in set
如果那一行存在的话,那么替换那一行,如果那一行不存在,那么添加那一行。
修改
update tbl_name set col_name1=expr1, [, col_name2=expr2 ...] [where conditon]
update使用细节:
1. update语法可以用新值更新原有表中的各列;
2. set子句只是要修改哪些列和要给予哪些值,可以更新多个字段set 字段1=值1,字段2=值2
;
3. where子句指定应该更新哪些行,如果没有where子句,则更新所有行。
- 第一个例子是没有where子句,将所有name都改为’小红’;
- 第二个例子是指定id为1的name改为‘小明’;
- 第三个例子是指定name为’小红’的前两个数据改为’西红柿’。
删除
delete from tbl_name [where condition]
- 如果没有where子句,那么数据将会被一行一行的删掉;
- 如果要删除整个表的记录,也可以使用truncate;
- 带where子句:删除满足条件的记录;
- delete只删除数据,不会影响表的结构;
delete和truncate的区别:
1. 效果一样,但是truncate更快;
2. delete可以带where子句,删除更加灵活;
3. delete可以返回被删除的记录数,而truncate返回0。
在练习删除时,可以复制一份表,避免数据被删除:
1. 复制表结构
create table tt1 like tt7;
2. 把tt7中的数据赋值到tt1中
insert into tt1 select* from tt7;