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

DBA DAY02

一 、字段约束条件

1.1  作用: 限制如何给字段赋值的

1.2  包括内容有:  NULL    Key    Default     Extra 

NULL  是否允许给字段赋null值  
           null           默认允许赋null值    
           not  null   不允许赋null值

key     键值类型:普通索引   唯一索引  全文索引  主键  外 键

Default 默认值 作用:当不被字段赋值时,使用默认值给字段赋值
             不设置默认值是  系统定义的是null
             default   值   
Extra    额外设置  ,字段是否设置为自动增加,默认没有自动增长功能

二、修改表结构

2.1 修改表结构的命令

mysql>  alter  table  库.表    执行动作 ;

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

可加AFTER字段名,或则FIRST;

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

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 字段名,drop 字段名;

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

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

modify只能修改Type,Null,Default

     

 修改时不能与已经存储的数据矛盾的话不允许修改
 alter table 表名 modify   字段名    类型(宽度)  [ 约束条件]
 可加AFTER 字段名 或则FIRST;

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

change只能修改Field


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

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

2.1.5 修改表名 rename

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

mysql> alter table  t1   rename    stu;


三、mysql键值

设置在表中字段上的,作用是约束如何给字段赋值。同时会给字段做索引。

索引类型包括:Btree、B+tree、hash

索引介绍: 树状目录结构  类似与书的“目录”

优点:加快查询表记录的速度
缺点 : 会减慢编辑表记录的速度,且占用磁盘的物理存储空间

          (delete  insert   update)

3.1 键值:普通索引   唯一索引  全文索引  主键  外 键

                    *                                          *        *

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

使用规则?

    --一个表中可以有多个INDEX字段

    --字段的值允许有重复,且可以赋为NULL值

    --经常把做查询条件的字段设置为INDEX字段

    --INDEX字段的KEY标志为MUL

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

desc   studb.t2

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

);

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

查看

desc  表名;

show   index  from   表名\G;

mysql> drop index wight on t2;

Table: t2
Key_name: aaa
Column_name: age

Index_type: BTREE  (二叉树)

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

+++++++++++++++++++++++++++++++

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

(普通主键    复合主键    主键+auto_increment)

普通主键:

使用规则?

  --一个表中只能由一个primary key字段

  --对应的字段值不允许有重复,且不允许赋NULL值

  --如果由多个字段都作为PRIMARY KEY,称为复合主键

创建
在已有表创建     alter  table   表   add   primary  key(字段名);

建表时创建
create  table  表名(
字段列表,
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的字段必须满足是主键且是数值类型

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); //成功


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

数值类型                i=i+1

删除主键   mysql>  alter  table   表   drop    primary  key;
++++++++++++++++++++++++++++++++++++++

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

什么是外键?

给当前表中字段赋值时,值只能在其他表的指定字段值的范围里选择

使用规则?

    --表的存储引擎必须是innodb

    --字段类型要一致

    --被参照字段必须要是索引类型的一种(primary key)

创建外键 foreign  key 的命令格式:
create   table   表(
字段名列表,
foreign  key(字段名)   references  表名(字段名) 
on  update cascade    on  delete  cascade
)engine=innodb;

员工表
mysql> create table yginfo(yg_id int(2) primary key auto_increment,name char(15))engine innodb;

mysql> insert into yginfo (name) values("bob");

mysql> insert into yginfo (name) values("bob");

mysql> insert into yginfo (name) values("lucy");

select  *  from  yginfo;

工资表 
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;

查看gztab表结构:

desc gztab;



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);   //存储失败

select  * from gztab;

mysql> update yginfo set yg_id=7 where yg_id=2;
mysql> delete from jfb where jfb_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; 

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

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

猜你喜欢

转载自blog.csdn.net/qq_36441027/article/details/81005723