DBA02 - 约束条件 修改表结构 MySQL键值

本文详细介绍了MySQL中表结构的修改方法,包括字段的添加、修改、删除等操作,以及不同类型的键值(如主键、外键、索引等)的创建与使用技巧。

DBA DAY02

一 、字段约束条件

1.1  约束条件 (限制如何给字段赋值的)

约束条件:
NULL      是否允许给字段赋null值  
               YES    默认允许赋null值    
               NO      不允许赋null值
key         键值类型:普通索引   唯一索引  全文索引  主键  外 键
Default   默认值 作用:当不被字段赋值时,使用默认值给字段赋值
              不设置默认值是  系统定义的是null为default值   
Extra      额外设置  ,字段是否设置为自动增加,默认没有自动增长功能

二、修改表结构

2.1 修改表结构的命令

• 基本用法
– ALTER TABLE 表名 执行动作 ;
Add        添加字段
Modify    修改字段类型
Change  修改字段名
Drop       删除字段
Rename 修改表名

2.1.1 添加新字段      add   字段名    类型(宽度)  [ 约束条件]

• 基本用法
– ALTER TABLE 表名
– ADD 字段名 类型 ( 宽度 ) 约束条件 ;
可加 AFTER 字段名 ;
或者 FIRST;

alter  table   t1   add   name   char(15)  first ;
alter  table   t1   add   addrhome   varchar(50)  default  “beijing”;
alter  table   t1   add   sex   enum(“boy”,”girl”) not null  default “boy”  after   name;

2.1.2 删除已有字段  drop   字段名

• 基本用法
– ALTER TABLE 表名
– drop 字段名 ;

alter table 表名 drop 字段名,drop 字段名;

mysql> alter  table   studb.t1   drop sex  ,   drop name;

2.1.3 修改已有字段的类型宽度及约束条件

• 基本用法
 修改时不能与已经存储的数据矛盾的话不允许修改
– ALTER TABLE 表名
– modify 字段名 类型 ( 宽度 ) 约束条件 ;
可加 AFTER 字段名 ;
或者 FIRST;    

modify只能修改Type,Null,Default

 alter table 表名 modify   字段名    类型(宽度)  [ 约束条件]

mysql> alter table   t1  modify level smallint(6) not null;

mysql> alter table  t1  modify  addrhome char(10) default “beijing”;

mysql> alter table t1 modify age tinyint(4) first;

2.1.4 修改字段名change

• 基本用法
– ALTER TABLE 表名
– change 源字段名 新字段名 类型 ( 宽度 ) 约束条件;

change只能修改Field

 

alter  table  表名  change   源字段名   新字段名   类型(宽度)  [ 约束条件]

mysql> alter table  t1  change addrhome  home char(10) default “beijing”;

2.1.5 修改表名 rename

• 基本用法
– ALTER TABLE 表名
– Rename 新表名;

alter  table  源表名  rename   [to]   新表名;

mysql> alter table  t1   rename    stu;

三、mysql键值

3.1 MySQL索引概述

3.1.1 索引介绍

• 索引是什么?
– 索引是对记录集的多个字段进行排序的方法。
– 类似于书的目录
– 索引类型包括 :Btree 、 B+tree 、 hash索引优缺点

3.1.2 索引优缺点

• 索引优点
– 通过创建唯一性索引,可以保证数据库表中每一行数
据的唯一性
– 可以加快数据的检索速度
• 索引缺点
– 当对表中的数据进行增加、删除和修改的时候,索引
也要动态的维护,降低了数据的维护速度
– 索引需要占物理空间

3.2 MySQL 键值类型

3.2.1 键值类型

• INDEX :普通索引
• UNIQUE :唯一索引
• FULLTEXT :全文索引
• PRIMARY KEY :主键
• FOREIGN KEY :外键

3.1.1  INDEX普通索引  (作用:给字段排序的)

• 使用说明
– 一个表中可以有多个 INDEX 字段
– 字段的值允许有重复,切可以赋 NULL 值
– 经常把做查询条件的字段设置为 INDEX 字段
– INDEX 字段的 KEY 标志是 MUL

  • 创建索引

1.在已有表创建
create   index   索引名  on   表名(字段名);
create  index    aaa     on    studb.t2(age);
desc   studb.t2

2.建表时创建
create  table  表名(
字段列表,
index(字段名),
index(字段名),
);

mysql> create table t2(name char(10),sex enum(“boy”,”girl”),weight int,index(name),index(weight));

  • 查看索引

show create  table 表名;

show   index  from   表名\G;

  • 删除索引

drop   index   索引名  on   表名;
mysql> drop index name on t2;

3.1.2主键 primary   key (作用:控制如何给字段赋值的   不能为空且不能重复)

• 注意事项
– 一个表中只能有一个 primary key 字段       (普通主键)
– 对应的字段值不允许有重复,且不允许赋 NULL 值
– 如果有多个字段都作为 PRIMARY KEY ,称为复合主
键,必须一起创建。                                        (复合主键)
– 主键字段的 KEY 标志是 PRI
– 通常与 AUTO_INCREMENT 连用             (主键+auto_increment)
– 经常把表中能够唯一标识记录的字段设置为主键字段 [ 记录编号字段 ]

一、普通主键

  • 创建主键

1.建表的时候指定主键字段
create  table  表名(
字段列表,
primary  key(字段名)
);
2.在已有的表中设置 PRIMARY KEY 字段
– ALTER TABLE 表名 ADD PRIMARY KEY( 字段名 );

mysql> alter table game1 add primary key(id);

  • 删除主键

1.移除表中的 PRIMARY KEY 字段
– ALTER TABLE 表名 DROP PRIMARY KEY;    //移除主键前,如果有自增属性,必须先去掉

二、复合主键

创建复合主键的使用:多个字段一起做主键,插入记录时,只要做主键字段的值不同时重复,就可以插入记录。
不同时重复,就可以插入记录。

mysql> create  table studb.t23( 
    -> clientip   char(15),
    -> port smallint(2),
    -> status  enum(“allow”,”deny”),
    -> primary  key(clientip,port)
    -> );
mysql> desc   studb.t23

insert into  studb.t23  values(“1.1.1.1”,22,”allow”);  可以
insert into  studb.t23  values(“1.1.1.1”,22,”deny”);报错
insert into  studb.t23  values(“2.1.1.1”,22,”deny”);可以

三、主键+auto_increment

主键primary  key  通常和auto_increment连用。
要使用auto_increment的字段必须满足是主键且是数值类型

auto_increment可以让字段的值自动增长  i++

mysql> create table t1(id int(2) primary key auto_increment,name char(15) not null,age tinyint(2) unsigned default 19,pay float(7,2) default 26800);

mysql> insert into t1 (name,age,pay) values (“lijun”,22,18000);  //成功
mysql> insert into t1 (name,age,pay) values (“mayun”,22,18000);  //成功
mysql> insert into t1 (id,name,age,pay) values (2,”mayun”,22,18000);  //失败
mysql> insert into t1 (id,name,age,pay) values (5,”mayun”,22,18000);  //成功
mysql> insert into t1 (id,name,age,pay) values (null,”majiang”,22,18000); //成功



四、删除主键  

mysql> alter table 表  modify id int(2) not null;  //先去除auto_increment,才可以删除主键。因为auto_increment依赖于primary key

mysql>  alter  table   表   drop    primary  key;

mysql> alter table game1 drop primary key;

3.1.3 外 键(作用 限制如何给字段赋值的)

• 什么是外键?
– 让当前表字段的值在另一个表中字段值的范围内选择
• 使用外键的条件
– 表的存储引擎必须是 innodb
– 字段类型要一致
– 被参照字段必须要是索引类型的一种 (primary key)

  • 创建外键

1.建表的时候指定外键

create   table   表(
字段名列表,
foreign  key(字段名)   references  表名(字段名) 
on  update cascade    on  delete  cascade
)engine=innodb;

2.在已有表创建外键  
mysql> alter  table  gztab  add  foreign  key(gz_id)   references  yginfo
(yg_id)  on  update cascade    on  delete  cascade;

案例1:
1.创建员工表
mysql> create table yginfo(yg_id int(2) primary key auto_increment,name char(15))engine innodb;

2.往员工信息表中插入数据

mysql> insert into yginfo (name) values(“bob”);

mysql> insert into yginfo (name) values(“jack”);

mysql> insert into yginfo (name) values(“lucy”);

select  *  from  yginfo;

3.创建工资表 
mysql> create table gztab(gz_id int(2),pay float(7,2),foreign key(gz_id) references  yginfo(yg_id) on delete cascade on update cascade)engine=innodb;

desc gztab;

4.往工资表里面插入数据

mysql> insert into gztab values(1,50000);   //成功

mysql> insert into gztab values(2,40000);   //成功

mysql> insert into gztab values(3,60000);   //成功

mysql> insert into gztab values(4,70000);   //存储失败,超出了参考表的yg_id范围

select  * from gztab;

mysql> update yginfo set yg_id=7 where yg_id=2;
select  * from yginfo;
select  * from gztab;   //工资表会同步更新已经修改的参考值

  • 查看外键

mysql> show create table yginfo;  (其中 gztab_ibfk_1就是外键名称)

删除yginfo的数据,gztab里面的数据也会随之删除

mysql> delete from yginfo;

当再次插入数据时,被primary key和auto_increment修饰的字段。这个字段是多少开始,是由AUTO_INCREMENT这个变量决定的,并不是从1开始的

mysql> insert into yginfo (name) values(“bob”);

mysql> insert into yginfo (name) values(“lucy”);

mysql> insert into yginfo (name) values(“lijun”);

给gztab赋值时,因为gztab表的字段gz_id仅仅是forigen.所以它是可以重复也可以为空的

mysql> insert into gztab values(4,5000);

mysql> insert into gztab values(5,5000);

mysql> insert into gztab values(6,5000);

mysql> insert into gztab values(4,5000);

mysql> insert into gztab values(null,5000);   //null没有超出  yginfo表中id_info的4,5,6的范围。

为了避免重复发工资和给null发工资,我们可以给gztab表中的gz_id再设置为主键。让gz_id既要满足外键的约束也要满足自身的主键才能存入。

mysql> delete from gztab;

为gztab表的gz_id字段设置主键

mysql> alter table gztab add primary key(gz_id);

mysql> insert into gztab values(4,5000);

mysql> insert into gztab values(4,5000);    //主键gz_id不允许重复,报错

mysql> insert into gztab values(null,5000); //主键gz_id不能为空,报错

mysql> insert into gztab values(5,5000);  //成功

mysql> insert into gztab values(6,5000);  //成功

mysql> insert into gztab values(7,5000);  //超出了参考索引(主键)的约束范围,报错

mysql> select * from gztab;

  • 删除外键   

mysql> show create table gztab;   //查看外键名称

alter  table  表名  drop  foreign key  外键名;
alter  table  bjb  drop  foreign key  gztab_ibfk_1; 

删除外键之后就可以添加不是参考范围内的值了。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值