MySQL中列的属性
一张表单靠一个数据类型来规范是狭隘的,很单一,所以需要一些额外的属性来规范和约束;
NULL , NOTNULL , default , Primary key , auto_increment , comment
1.注释:comment,这个没有实际的约束意义,只是单纯的为了看着更方便,更助于理解的字段;
2.默认值:default,某一种数据经常性出现某个具体的值,可以一开始就定义好,在需要真实数据的时候,用户可以选择性的使用;
比如在插入一条数据的时候,不给该字段赋值,想使用默认值可以不一定要去指定列表,故意不适用字段列表:可以使用default关键字来代替值.
intsert into my_table values (‘老衲’,18,default);
3.主键:primary,一张表中用来唯一约束这一字段的所有数据,不能重复;比如现有一个Student表,一个Student字段只能对应一个主键,这个主键用来唯一标识这个Student字段;
一张表中只能有一个主键,主键不能为空.但可以将多个字段设置成联合主键(不建议使用);
添加主键的方式:
1.直接在所有字段的后面写上、primary key(’’,’’);
CREATE TABLE order2
( oid
VARCHAR(20) NOT NULL, oname
VARCHAR(20) NOT NULL, PRIMARY KEY (oid
) );
2.直接在字段后面加上primary key 关键字即可;
CREATE TABLE order3
( oid
VARCHAR(20) NOT NULL PRIMARY KEY , oname
VARCHAR(20) NOT NULL);
3.当表已将创建之后,再次额外追加主键,可以修改字段属性,也可以直接追加
alter table 表名 modify 字段名 primary key;
alter table 表名 add primary key (字段列表);
主键的前提:
主键使用的字段本身是单一的,不可重复;
主键约束:
主键对应得字段中的数据不允许重复,一旦重复,数据操作失败
更新主键&删除主键
不能更新主键,只能在删除后添加主键;
删除主键:
alter table 表名 drop primary key;
主键分类:
业务主键:在真正的项目中很少使用业务数据来当做业务主键;
逻辑主键:使用与业务数据无关的属性来当做逻辑主键;
4.自动增长:auto_increment
一张表只能有一个自增字段,
MySQL 每张表只能有1个自动增长字段,这个自动增长字段即可作为主键,也可以用作非主键使用,但是请注意将自动增长字段当做非主键使用时必须必须为其添加唯一索引,否则系统将会报错;
当对应的字段,不给值,或者默认为NULL的时候,会自动的被系统出发,系统会从当前字段中已有的最大值进行+1操作,得到一个新的不同的字段. 自增长通常是作为主键的;
1.任何一个字段要自增必须是一个索引;
2.该字段必须是数值类型,其余类型不可以;
3.一张表只能有一个自增的字段;
其实我是有一个问题的,不过到现在也没有解决:我就是纳闷,当初设计MySQL的人员到底是出于什么的考虑,才要求一张表只能有一个自增的字段??如果看见这个文章的小哥哥小改改了解的话,感谢您能给我解惑,谢谢!
自增长为什么是从1开始?为什么每次都增长1?
所有系统的变量(如字符集,校对集)都是有系统变量控制的
查看自增长对应的变量: show variables like ‘auto_increment%’;
auto _increment_offset 起始值
auto _increment_increment 步长
修改变量实现不同的效果:修改是对整个数据库修改,而不是单张表(一般没有必要修改)
修改自增长步长: set auto _increment_set = 5;
删除自增长
alter table 表名 drop id int ;
注意在删除的时候,不要加主键 primary key;
5.唯一键:unique key,
一张表可能会有多个字段需要有唯一性,但是一张表只能有一个主键,由此产生了unique key唯一键,唯一键便解决了一张表中多个字段需要有唯一约束这个问题的本质;唯一键允许是NUll,因为NULL字段不会参与比较,可以出现多个NULL;
1.创建表的时候,可以在字段后面直接添加unique key 标示
2.在所有的字段之后增加unique key (字段列表),同样支持复合唯一键
3.在创建表之后增加唯一键
alter table 表名 add unique key (字段名);
唯一键约束:
可以为空,可以多个为空.如果唯一键NOT NULL那就和主键约束完全一致
更新唯一键 & 删除唯一键
删除:alter table 表名 drop index 索引名字;
–唯一键默认时候字段名作为索引名.(删除的是唯一键约束而不是字段)
唯一键和主键的区别:
主键不可以是NULL,唯一键可以是NULL;一张表中只能有一个主键,但一张表可以有多个唯一键,可以说唯一键的出现就是为了解决主键的约束性;主键的约束是不重复,唯一键的约束是可为空,也可多个为空,若唯一键NOT NULL,那就和主键约束一样了;
6.索引:
系统根据某种算法,根据已有的字段,单独创建一个文件,文件能够快速实现匹配,能够快速查找对应的数据;
索引最重要的一个特点就是能大大提高查询的效率;
索引的种类:
普通索引:索引,普通的
主键索引:即主键,一张表一个,不可为空且不可重复;
唯一索引:设置成唯一索引的不可重复;
全文索引:全文索引,用于在一篇文章中,检索文本信息的;
MYSQL索引用来快速地寻找那些具有特定值的记录,所有MySQL索引都以B-树的形式保存。如果没有索引,执行查询时MySQL必须从第一个记录 开始扫描整个表的所有记录,直至找到符合要求的记录。表里面的记录数量越多,这个操作的代价就越高。如果作为搜索条件的列上已经创建了索引,MySQL无 需扫描任何记录即可迅速得到目标记录所在的位置。如果表有1000个记录,通过索引查找记录至少要比顺序扫描记录快100倍。
总体分析
PRIMARY,INDEX,UNIQUE,FULLTEXT有什么区别?各适用于什么场合?
举个例子来说,比如你在为某商场做一个会员卡的系统。
这个系统有一个会员表
有下列字段:
会员编号 INT
会员姓名 VARCHAR(10)
会员身份证号码 VARCHAR(18)
会员电话 VARCHAR(10)
会员住址 VARCHAR(50)
会员备注信息 TEXT
那么这个 会员编号,作为主键,使用 PRIMARY
会员姓名 如果要建索引的话,那么就是普通的 INDEX
会员身份证号码 如果要建索引的话,那么可以选择 UNIQUE (唯一的,不允许重复)
会员备注信息 , 如果需要建索引的话,可以选择 FULLTEXT,全文搜索。
不过 FULLTEXT 用于搜索很长一篇文章的时候,效果最好。
用在比较短的文本,如果就一两行字的,普通的 INDEX 也可以。
创建索引使用说明
普通索引
create index on tablename (uid);
这是最基本的索引类型,而且它没有唯一性之类的限制。
创建索引,例如CREATE INDEX <索引的名字> ON tablename (列的列表);
修改表,例如ALTER TABLE tablename ADD INDEX [索引的名字] (列的列表);
创建表的时候指定索引,例如CREATE TABLE tablename ( […], INDEX [索引的名字] (列的列表) )
唯一性索引
这种索引和前面的“普通索引”基本相同,但有一个区别:索引列的所有值都只能出现一次,即必须唯一。
MYSQL主键:
MYSQL主键是一种唯一性索引,但它必须指定为“PRIMARY KEY”
例如“CREATE TABLE tablename ( […], PRIMARY KEY (列的列表) ); ”。但是,我们也可以通过修改表的方式加入主键,例如“ALTER TABLE tablename ADD PRIMARY KEY (列的列表); ”。每个表只能有一个主键。
全文索引
MySQL从3.23.23版开始支持全文索引和全文检索。在MySQL中,全文索引的索引类型为FULLTEXT。全文索引可以在VARCHAR或者TEXT类型的列上创建。它可以通过CREATE TABLE命令创建,也可以通过ALTER TABLE或CREATE INDEX命令创建。对于大规模的数据集,通过ALTER TABLE(或者CREATE INDEX)命令创建全文索引要比把记录插入带有全文索引的空表更快。
主键和唯一索引的区别
主键是一种约束,唯一索引是一种索引,两者在本质上是不同的。
主键创建后一定包含一个唯一性索引,唯一性索引并不一定就是主键。
唯一性索引列允许空值,而主键列不允许为空值。
主键列在创建时,已经默认为空值 + 唯一索引了。
主键可以被其他表引用为外键,而唯一索引不能。
一个表最多只能创建一个主键,但可以创建多个唯一索引。
主键更适合那些不容易更改的唯一标识,如自动递增列、身份证号等。
在 RBO 模式下,主键的执行计划优先级要高于唯一索引。 两者可以提高查询的速度。
总结
本文写出了MySQL的列的属性,欢迎大家来"找茬";
/*************************************************************************
/*************************************************************************
此文章版权方是个人,目的是为自己记录学习历程的同时为大家提供一些参考;如果有不正确的地方,欢迎大家提出!
/*************************************************************************
/*************************************************************************