MySQL系列(三):字段属性

约束字段的是数据类型,字段属性会添加一些额外的约束,来更加保证数据的合法性。

如:null/not null、 default、primary key、unique key、auto_increment、comment等。  

1.空

null/not null:

数据库基本都是字段默认会为空,但是实际上在真实开发的时候,尽可能的要保证所有的数据都不应该为空。空数据没有意义,空数据没有办法参与运算。

2.注释

comment:

用来描述字段,会根据表创建语句保存。用来给程序猿/DBA来对字段进行了解的。

3.默认值

default:

某一种数据会经常性的出现某个具体的值,可以在一开始就指定好,在需要真实数据的时候,用户可以选择性的使用默认值。

在数据进行插入的时候,不给改字段赋值或者使用default会自动插入默认值。

insert into my_default (name) values('xxx');
insert into my_default values('xxx',18,default);
4.主键

primary key:

非空且唯一,数据重复会导致操作失败,一张表最多只能有一个主键。

增加主键:

1)、在创建表的时候,直接在字段之后加上 primary key,该操作只能使用一个字段作为主键。
2)、在创建表的时候,在所有的字段之后,使用 primary key(主键字段列表)来(可以是多个字段的复合主键)
3)、创建好表的时候,额外追加主键,通过修改表字段属性,也可以直接追加。改操作针对表中字段对应的数据本身是独立的(不重复)。
alter table 表名 add primary key(字段列表);

更新与删除主键:

没有办法更新主键,主键必须先删除,再增加。
alter table 表名 drop primary key;

在实际创建表的时候,很少使用真实业务数据作为主键字段(业务主键)。大部分的时候是使用逻辑性的字段(字段没有业务含义),将这种字段主键称之为逻辑主键。

5.自增长

auto_increment:

当对应的字段,不给值、给默认值或者给NULL的时候,自增长会自动的被系统触发,系统会从当前字段中已有的最大值再进行+1操作,得到一个新的不同的字段。自增长通常是跟主键搭配使用。

  • 任何一个字段要做自增长必须前提是本身是一个索引(key)
  • 自增长字段必须是数字(整型)
  • 一张表最多只能有一个自增长
  • 当自增长被给定的值为NULL、默认值或者不给值的时候会触发自动增长
  • 自增长如果对应的字段输入了值,那么自增长失效,但是下一次还是能够正确的自增长(从最大值+1)

修改自增长:

自增长如果是涉及到字段改变,必须先删除自增长,后增加(一张表只能有一个自增长)。

修改当前自增长已经存在的值,修改只能比当前已有的自增长的最大值大,不能小(小不生效),只能向上修改。
alter table 表名 auto_increment = 值;

所有系统的变量(如字符集,校对集)都是由系统内部的变量进行控制的,查看自增长对应的变量:
show variables like 'auto_increment%';

可以修改变量实现不同的效果: 修改是对整个数据修改,而不是单张表 (会话级,表示只对当前本次有效,关闭了数据库连接之后,就失效了)
set auto_increment_increment = 5; -- 一次自增5

删除自增长:

可以通过modify来进行修改(保证字段没有auto_increment即可)
alter table 表名 modify 字段 类型;

6.唯一键

unique/unique key:

唯一可为空。

一张表往往有很多字段需要具有唯一性,数据不能重复,但是一张表中只能有一个主键,唯一键(unique key)就可以解决表中有多个字段需要唯一性约束的问题。

唯一键的本质与主键差不多,唯一键默认的允许自动为空,而且可以多个为空(空字段不参与唯一性比较)。

增加唯一键:

和增加主键的方式差不多,

1.在创建表的时候,字段之后直接跟 unique/ unique key

2.在创建表的时候,在所有的字段之后增加 unique key(字段列表),可以是多个字段

3.建好表之后,alter table 表名 add unique key(字段列表)

修改与删除唯一键:

alter table 表名 drop index 索引名字;     -- 唯一键默认的使用字段名作为索引名字

7.索引

index:

  • 系统根据某种算法,将已有的数据(未来可能新增的数据),单独建立一个文件,文件能够实现快速的匹配数据,并且能够快速的找到对应表中的记录。
  • 索引本身会产生索引文件(有时候有可能比数据文件还大) ,会非常耗费磁盘空间。
  • 如果某个字段需要作为查询的条件经常使用, 那么可以使用索引(一定会想办法增加)。
  • 如果某个字段需要进行数据的有效性约束,也可能使用索引(主键、唯一键)。
  • 主键索引:primary key
  • 唯一索引:unique key
  • 普通索引:index
  • 复合索引
  • 索引覆盖
  • 全文索引:fulltext index。

全文索引针对文章内部的关键字进行索引,最大的问题在于如何确定关键字。英文很容易,因为英文单词与单词之间有空格;中文比较难,没有空格, 而且中文可以各种随意组合(分词: sphinx)。

8.外键

foreign key:

如果一张表中有一个字段(非主键)指向另外一张表的主键,那么将该字段称之为外键。mysql innoDB引擎才支持外建。

增加外键:

1.创建表的时候, 在所有的表字段之后,使用 foreign key(外键字段)   references 外部表(主键字段)

2.表创建好之后,alter table 表名 add [constraint 外键名字] foreign key(外键字段) references 父表(主键字段);

修改与删除外键:

外键不可修改,只能先删除后新增:
alter table 表名 drop foreign key 外键名;      -- 一张表中可以有多个外键,但是名字不能相同

外键作用:

  • 对子表约束:子表(外键字段所在的表)数据进行写操作(增和改)的时候,如果对应的外键字段在父表找不到对应的匹配,那么操作会失败(约束子表数据操作)。
  • 对父表约束:父表(外表)数据进行写操作(删和改都必须涉及到主键本身),如果对应的主键在子表中已经被数据所引用,那么就不允许操作。

外键条件:

  • 外键要存在,首先必须保证表的存储引擎是innodb(默认的存储引擎),如果不是innodb存储引擎,那么外键可以创建成功,但是没有约束效果。
  • 外键字段的字段类型(列类型)必须与父表的主键类型完全一致。
  • 一张表中的外键名字不能重复。
  • 增加外键的字段(数据已经存在),必须保证数据与父表主键要求对应。

外键约束:

外键约束有三种约束模式,都是针对父表的约束:

  • district:严格模式(默认), 父表不能删除或者更新一个已经被子表数据引用的记录
  • cascade:级联模式: 父表的操作, 对应子表关联的数据也跟着被操作
  • set null:置空模式: 父表的操作之后,子表对应的数据(外键字段)被置空

通常的一个合理的做法(约束模式):删除的时候子表置空,更新的时候子表级联操作。
roreign key(外键字段) references 父表(主键字段) on delete set null on update cascade;

删除置空的前提条件是外键字段允许为空(如果不满足条件,外键无法创建)。
对于PHP开发来说,很少使用外键来处理。

转载于:https://my.oschina.net/programs/blog/1789522

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值