一、字段约束条件
建表时不增加约束条件为mysql的默认约束条件,desc 表名-->后4字段:
null key default
null:yes为插入记录时可为空值(即插入的值为null),no为不允许
设置方法:类型后面加not null 默认为null
eg:creat table xx(xx char(5) not null);
key:索引类型
default:默认值的值,默认不设置默认值的默认值为null,默认值的设置要符合类型的条件。
设置方法:类型后面加default 值, 默认为null
eg:creat table xx(xx int(5) default 0 );
extra:字段是否设置自动增加,需要跟key一起合用。
eg:
ps:“”不是空值,属于占位符,“null”也不是空,而是字符null
二、修改表结构
基本用法:alter table 表名 执行动作
执行动作:
1.添加新字段,可通过first或after设置添加字段在表中的位置,默认为最后
格式:基本用法 add 字段名 类型(宽度) 约束条件 [first/after 字段名]
eg:
mysql> alter table t14
-> add email varchar(30) default "stu@tedu.cn",add tel char(11);
mysql> alter table t14
-> add sex enum ("boy" ,"girl","no") after name;
2.修改字段名:比modify多了修改字段名的功能
格式:基本用法 change 源字段名 新字段名 类型(宽度) 约束条件 [first/after 字段名]
3.修改字段类型或约束条件:若修改时表已经存有数据且新类型或条件与已有数据冲突,则报错;若修改类型时没有把原有约束条件加上,则约束条件会还原为默认;改位置时则照抄类型与约束条件,然后加first或after
格式:基本用法modify 字段 类型 约束条件 [first/after 字段名]
4.删除字段:表中有多条记录时,所有列此字段的值都会被删除
格式:基本用法 drop 字段名
5.修改表名:基本用法 rename 表名
ps:生产环境中基本都是先规划好表结构再写入记录,比较少修改表结构,因为会收存储数据的限制。
三、mysql键值
1.索引是什么?
索引是对记录集的比格字段进行排序的方法;
类似于书的目录;
2.索引类型:Btree、B+tree、hash
3.优点:
--通过创建唯一性索引,可以保证数据库表中每一行数据的唯一性;
--可以加快数据的检索速度。
4.缺点:
--当对表中的数据进行增加、删除和修改时,索引也要动态的进行维护,降低了数据的维护速度;
--索引也需要占据物理空间。
5.键值类型
--普通索引 index *
--唯一索引 unique
--主键 primary key *
--外键 foreign key *
--全文索引 fulltext
--所需掌握内容:创建删除查看使用规则
6.index普通索引
--使用说明:
----一个表中可以有多个index字段;
----字段的值允许有重复,且可以赋null值;
----经常把做查询条件的字段设置为index字段;
----index字段的key标志是mul
----默认的索引类型为btree(二叉树算法)
----索引名默认与字段名同名,删除时通过删索引名删除
--创建索引:
----在建表时创建:create table xx (字段1,字段2...index(字段3),index(字段4));
----eg:
mysql> create table t16(
-> name char(10),
-> age int(2),
-> class char(7),
-> index (name),
-> index (class)
-> );
----在已有表上创建索引:create index 索引名 on 表名(字段名);
----eg:
mysql> create index class on t16(class);
ps:为了方便,一般设索引名时设成与字段名同名。
--查看详细信息:show index from 表名\G;
mysql> show index from t16\G;
--删除索引:drop index (索引名) on 表名;
mysql> drop index class on t16;
7.primary key主键
--使用说明:
----一个表中只能有一个primary key字段;
----对应的字段值不允许有重复,且不允许赋null值;
----如果有多个字段都作为primary key,称为复合主键,必须一起创建;
----主键字段的key标志是pri
----通常与auto_increment(字段值自增长)连用,
----------------------自增长:当没有给具有自增长的字段赋值时,字段继承当前字段中的最大 字段值加一作为新的字段值使用
-------------------------------使用自增长的条件:必须是主键且字段类型为数值型
----经常把表中能够唯一标示记录的字段设置为主键字段[记录编号字段]
--创建主键(2种方式结果一样)
eg1:
mysql> create table t17(
-> stu_id char(9) primary key,
-> name char(10)
-> );
eg2:
mysql> create table t18 (
-> stu_id char(9),
-> name char(10),
-> primary key(stu_id)
-> );
desc t17; 对比 desc t18;
--删除主键
----alter table 表名 drop primary key;
--添加主键
----alter table 表名 add primary key(字段名)
----必须字段值没有重复和空,有则改掉或者删掉记录。
--复合主键:多个字段一起做主键,只要不是几个字段的值都相同则不算重复
----创建复合主键:create table 表名(字段1,字段2... primary key(字段1,字段3...));
eg:
mysql> create table t19 le t19 (
-> ip char(8),
-> serport smallint(2),
-> status enum("yes","no"),
-> primary key (ip,serport)
-> );
mysql> insert into t19 values(
-> "1.1.1.1",22,"no");
mysql> insert into t19 values(
-> "1.1.1.1",21,"yes");
mysql> insert into t19 values(
-> "1.1.1.1",21,1);
ERROR 1062 (23000): Duplicate entry '1.1.1.1-21' for key 'PRIMARY'
mysql> insert into t19 values(
-> "2.1.1.1",21,1);
----删复合主键:alter table 表名 drop primary key;
----添加复合主键:alter table 表名 add primary key(字段名1,字段名2...);
eg2:(自增长)
mysql> create table t20(
-> stu_id int(2) auto_increment,
-> name char(10),
-> age tinyint(2),
-> primary key(stu_id,name)
-> );
mysql> insert into t20(name,age) values("bob",19);
mysql> insert into t20(name,age) values("tob",20);
mysql> insert into t20 values(10,"haha1",20);
mysql> insert into t20 values(8,"haha2",20);
mysql> insert into t20 values(null,"haha3",20);
mysql> select * from t20;
8.foreign key 外键
--什么是外键:让当前表字段的值在另一个中字段值的范围内选择
--实例:企业发放工资的工资表应参考企业的员工表,避免出现多发或发错人的行为。
--使用外键的条件:
---------表的存储引擎必须是innodb
---------字段类型要一致
----------被参照字段必须要是索引类型的一种(primary key)
--基本用法:create table 表A
create table 表B (字段1,字段2... foreign key (字段x) references 表A(字段y) on update cascade on delete cascade
//on update cascade及 on delete cascade 是设置同步更新和同步删除,设置后当被参考字段的值发生改变时,参考字段的值会随之更改;
--查是否设置外键只能通过查建表的规则来查看:
show create table 表名
--删除外键字段:
alter table 表名drop foreign key 约束名
//约束名可通过查建表规则里的constraint找到
eg:
mysql> create table ygb(
-> yg_id int(2) primary key auto_increment,
-> name char(15),
-> bumen char(20)
-> )engine=innodb;
mysql> create table gzb(gz_id int(2),
->name char(15),
->pay float(7,2),
->bumen char(20),
->foreign key(gz_id) references ygb(yg_id) on update cascade on delete cascade)engine=innodb;
问题:实际应用中,单靠外键只能约束字段值的范围,不能约束字段值不可重复以及字段值为空,因此常常还会给该字段同时加上主键进行约束。