unsigned:这里约束的意思是没符号,不能为负数,只能是整数
####建立外键约束的表格
提示: 给表添加外键约束的时候,外键列和参照列必须的类型必须一致,就好比上图的中的两个表格的类型都是int,但是当我们的父表的类型是**smallint,而子表的类型是bigint,**这样也是会报错的,其中数字的长度或者是否有符号位(unsigned)必须相同,字符的长度可以不相同,索引也必须相同,外键表中的索引会随着父表的索引自动创建,当父表中设置了主键约束,主键就会自动创建索引
####外键约束的参照操作
-
cascade:从父表删除或更新且自动删除或更新子表的行
-
set null:从父表删除或更新行,并设置子表中的外键列为null。
如果使用该选项,必须保证子表列没有指定not null
-
resirict:拒绝对父表的删除或者更新操作
-
no action :标准sql的关键字,在mysql中与restrict相同
由上图中的指令,on delete
是在执行删除指令,当我们重新创建一张表关联父表,然后为他们添加数据,但是当我们删除父表中的数据后,子表中的数据也会随着父表的删除而删除,这里只是展示了删除,同时更新也是一样的
#####表级约束与列级约束
列级约束:就是对一个数据列建立的约束
表级约束:就是对多个数据列建立的约束
列级约束既可以在列定义的时候声明,也可以在列定义后声明;表级约束只能在列定义后声明
####修改数据表:添加/删除列
提示:以下代码中[ ]中的内容表示可以写也可以不写
- 添加单列:
alter table 表格名称 add [column] 列名称column_definition [first|after 列名称]
由上图可以看出我们在表格中可以添加列和并且可以确定新添加的列位置
- 添加多列
alter table 表格名称 add [column] (列名称 column_definition,...)
- 删除列
alter table 表格名称 drop[column] 列名称
由上图可以得出,可以删除一个或者提示删除俩个
- 添加主键约束
alter table 表格名称 add [constraint[symbol]] primary key [index_type](表字段的名字)
**提示:**上述指令中的constraint可以写也可以不写,symbol是表示给主键起的名称
这里我们创建了一张表没有设置主键,然后加了一个表字段id,但是还是没有添加主键约束
然后当我们给id添加了主键约束后,可以看出key的一列中id中primary,表示添加主键约束成功
- 添加唯一约束
alter table 表格名称 add [constraint[symbol]] unique [index_type](表字段的名字)
- 添加外键约束
alter table 表格名称 add foreign key(表字段) references 父表名称 (表字段);
- 添加和删除默认约束
alter table 表格名称 alter [columns] 表字段 {set default 默认值|drop default}
由上图可以看出我们新添加了一个表字段为sex,默认值设为女
然后我们删除默认值后,这个sex字段就没有默认约束了
**提示:**添加默认约束和删除默认约束只是把set default修改为drop default
- 删除主键约束
alter table 表格名称 drop primary key
- 删除唯一约束
alter table 表格名称 drop unique (约束名称)
- 删除外键约束
alter table 表格名称 drop foreign key 约束名称
**提示:**再删除约束的时候,必须先得查询约束的名字show indexes from 表格名称
- 修改列的位置和类型
alter table 表格名称 modify[ column] 表字段 表字段的类型 列的位置
如上图所示,我们不仅修改了id的位置,还更改了id的类型,**注意:**当我们修改字段的类型时,当从大类型往小类型转换的时候,有可能会造成数据丢失
- 修改列名称
alter table 表格名称 change [column] 旧名称 新名称 列的类型[列的位置]
又上图我们修改了username的名字还更换了位置
- 修改数据表的名称
方法1:
alter table 表格名称 rename [to|as] 新名称
方法2:
rename table 表格名称 to 新名称
但是我们不建议随意修改表名称和列名称,有可能会造成某些操作无法进行