一。约束条件  作用控制如何给字段赋值
NULL       |                  key      |     default   |    extra
是否允许赋null值      键值            默认值        额外设置
 null(允许为空)   not(不允许为空) key(索引类型)   default(设置默认值,缺省为null)
create    table   t7(name   char (15)   not    null,   (不允许为空)
 class       char(7)   default      "nsd1804",            (设置默认值缺省为null)
age     tinyint(2)   not    null   default     19,
sex    enum("boy","girl")  not  null    default   "boy");   (enum给定值中选择一个)set(给定值中选择一个或多个)
desc    t7;
 
insert   into    t7(name)values("bob");(定义name的值为bob)
insert  into    t7    values("bob2","nsd1803",21,"girl");   (表结构对应的值)
insert into     t7   values("null",null,22,"boy");  
insert  into    t7  values("jim",null,22,"boy");       
insert  into  t7  values("",null,31,"boy");(姓名为空字符也算一个值,)
select   *  from  t7;
 
 
create    table  t8(name char(15)  not  null  default  "",
class   char(7)   default   "nsd1804",
age     tinyint(2)   not  null  default  19,
sex   enum ("boy","girl")  not   null  default  "boy");
insert   into   t8(class,age,sex)values("nsd1802",45,"boy");
select  *  from  t8;
二,修改表结构 :对已经创建的表的结构做修改:
添加新字段    :格式用法:alter  table   表名    add    字段名      类型(宽度)    约束条件;可加after字段名;或者first;
add
alter  table   db2.t8
add    email   varchar(50)  default   "student@tedu.cn",
add   qq      char(11);
desc   t8;
select     *   from   t8;
可加after字段名(在指定字段后面);或者first;(在所有字段前面)
alter  table   db2.t8
add   stu_num   char(9)   first,  (表结构在所有字段最前面)
add   likes    set("eat","sleeps","game","film")  after   sex;    (字段likes在指定字段sex后面)
删除已有字段:alter    table   db2.t8    drop    email; 
删除多个:alter  table   db2.t8   drop   email,   drop   qq;
desc   t8;
select   *  from   t8;
   修改已有字段类型 :       格式:alter   table   表名    modify   字段名    l类型(宽度)   约束条件;     可加可加after字段名;或者first;
modify
*修改字段类型时,若新的类型与字段已经存储数据冲突,不允许修改。
不修改的部分要原样写一遍,否则alter   table  t8  modify   stu_num   varchar(9);就是还原。
alter   table  t8  modify   stu_num   varchar(9);(不修改的写一遍)
alter    table   t8  modify
sex   enum('boy','girl',"no")  not  null   default   "boy";(修改性别为boy)
desc  t8;
(改变位置)
alter   table   t8    modify    sex   enum('boy','girl',"no")   not   null   default   "boy"  after  name;(sex性别默认值为boy,在表结构字段name后面)
select   *    from   t8;
    修改字段名    :   格式:alter   table    表名  change    源字段名    新字段名    类型(宽度)   约束条件;
change
   alter   table   t8   change   stu_num   stu_id   varchar(9);(把字段stu_num  改名为stu_id)
select  *   from    t8;
修改表 : 格式;alter  table  表名   rename  新表名;
rename  
alter    table   t8   rename   stuinfo ;(把表名t8改为stuinfo)
show    tables;
select    *   from   stuinfo;
三,MYSQL键值   (重点)    约束如何给字段赋值。
普通索引  index   唯一索引:unique   全文索引:fulltext     主键:primary   key      外键:  foreign    key
索引介绍:给字段值排序的树型结构,类似与“书的目录”
索引优点:方便查找加快查询数据的速度
索引缺点:1.占用存储空间   2.减慢写入数据的速度
使用索引
使用规则
查看、  desc   表 ;   key    ---MUL
           show    index   from    表;
创建:   把已有表的字段设置为index字段
desc   stuinfo;
show   index   from     stuinfo\G;(查看索引)
    create    index   aaa  on    stuinfo(name);    (设置为index字段,创建索引,把字段name设为索引,索引名为aaa,)
                               (索引名)      (表名)
desc     stuinfo;
show    index    from   stuinfo\G;(查看索引)
删除: Iindex
drop    index    aaa   on     stuinfo;(删除索引)
desc    stuinfo;
show    index     from     stuinfo\G;
创建表时指定index字段
create    table   t9(name    char(15)   not    null   default   "",(指定name的默认值为空字符)
class    char(7)   default    "nsd1804",(指定class的默认值为nsd1804)
age    tinyint(2)   not     null    default     19,(指定age默认值为19)
sex     enum("boy","girl")    not    null   default    "boy",(指定sex默认值为boy)
index(name),index(class));(把name,class,设为索引字段)
desc    t9;
show   index   from    t9\G;(查看t9表的索引)
 
四,primary  key  主键
限制如何给字段赋值  
primary key   使用规则(不能为空,不能重复)
建表时创建主键  字段
create  table  t10(stu_id  char(9)   primary  key,(把stu_id字段设为主键)
name   char(10),
age   int(2));
 
    两种方法
create   table   t11(stu_id  char(9),
name   char(10),
age     int(2),
primary   key(stu_id));(把字段stu_id设为主键)
desc   t10;
desc   t11;
inset    into    t10    values("nsd180401","lucy",21);
inset   into     t10    values("nsd180401","bob",21);
inset  into     t10     values(null,"lucy",21);
  
删除主键
alter    table    t10    drop    primary  key;(删除主键)
desc    t10;
insert     into      t10    values("nsd1804","lucy",21);
insert    into       t10    values(null,"lucy",21);
select   *    from    t10;
在已有表里创建主键字段
delete  from    t10;(有重复值先删除表记录才能设主键)
alter   table    t10    add     primary     key(stu_id);(创建主键添加到t10表里把字段stu_id设为主键)
desc   t10;
创建复合主键:表中的多个字段一起做主键,赋值时,主键字段的值不能重复。
create  table   t12(name   char(15),
class char(7),
pay    enum("yes","no"),
primary  key(name,class));
insert   into   t12   values("bob","nsd1804","yes");
insert   into    t12   values("bob","nsd1804","no");       (复合主键的值不能同时重复)
insert    into    t12    values("bob",nsd1805","yes");
insert    into    t12    values("bob","nsd1805","no");
删除复合主键:
alter   table    t12    drop    primary   key;(删除复合主键)
insert   into     t12    values("bob","nsd1805","no");(没有主键可以重复)
select   *   from    t12;
主键同常和auto_increment连用  让字段的值自动增长。
primary  数值必须有才能创建
向表中插入记录时 不给自动增长的字段赋值, 字段的值是如何获得的呢,用当前字段最大的值+1  后把结果做当前新记录字段的值
案:create  database db3;
     use  db3 
     create table  t1(id  int(2)  primary key auto_ increment,(把字段id设为主键自动增长)
   name  char(15)  not null,
   age  tinyint(2)  unsigned  default  19,
   pay  float(7,2)  default   26800);
   insert  into  t1(name,age,pay) values("tom",21,18000);
  insert  into  t1(name,age,pay) values("lucy",23,18800);(给对应字段赋值)
  insert  into  t1  values(7,"jerry",23,18800);
  insert  into  t1 (name,age,pay) values("alice",33,18800);
  insert  into  t1 values(null,"jerry2",23,18800);
删除自动增长:
alter  table  t2  change  id id int;(删除自动增长)
外键:让当前表字段的值,在另一个表字段值范围里选择。
外键的使用:1,表的储存引擎必须是innodb,字段类型必须一致,被参照字段必须是索引类型的一种,通常是主键primary key
格式:
 create table yginfo(yg_id  int(2) primary key auto_increment,(把yginfo表的字段yg_id设为主键自定增长)
name char(15))engine=innodb;(把字段name设为innodb引擎,支持回滚)
insert into yginfo(name)values("bob");
insert into yginfo(name)values("bob");
insert into yginfo(name)values("lucy");
select * from yginfo;
创建外键:
格式:foreign key(表a的字段名)
          references表b(字段名)
        on delete
      on  update
 
create  table  gztab(gz_id int(2),(表gztab,字段gz_id)
pay float(7,2),   float(小数类型)                                      cascade:层叠
foreign key(gz_id) references yginfo(yg_id)  on delete cascade on update cascade)engine=innodb;(创建外键,把yginfo表里内容作为gztab表的参照表)
select * from gztab;
desc gztab;
show create table gztab;
 
insert into gztab values(1,50000);(表1gztab发工资测试,以表2为参照)
insert into gztab values(2,25000);
insert into gztab values(3,35000);
insert into gztab values(4,60000);  如果没有编号者不能成立
同步更新
update yginfo set yg_id=7 where yg_id=2;(修改表yginfo的字段yg_id的id)
select  * from yginfo;
select * from gztab;
同步删除
delete from yginfo where yg_id=3;(删除yginfo表的字段yg_id的id)
select * from yginfo;
select * from gztab;
   字段值不允许重复和赋null值
alter table gztab add primary key(gz_id);(加主键可以不为空,不重复)
删除外键:
show create table gztab;(查看gztab表的外键)
alter table gztab drop foreign key  gztab_ibfk_1;(删除gztab表的外键)
show create table gztab;
alter   table  t8  modify   stu_num   varchar(9);                  注:通常是先删除外键才能删除主键索引)
数据库管理
 NSD DB 基础
 DAY02内容
 上午
 09:00 ~ 09:30 作业讲解和回顾
 09:30 ~ 10:20 约束条件
 10:30 ~ 11:20 修改表结构
 11:30 ~ 12:00
 14:00 ~ 14:50
 下午
 15:00 ~ 15:50
 MySQL 键值
 16:10 ~ 17:00
 17:10 ~ 18:00
 总结和答疑约束条件约束条件
 • Null 允许为空,默认设置
 • NOT NULL 不允许为空
 知
 识
 讲
 解
 索引类型
 • Key
 • Default 设置默认值,缺省为 NULL约束条件(续 1 )
 知
 识
 讲
 解修改表结构
 修改表结构
 修改表结构
 语法结构
 添加新字段
 修改字段类型
 修改字段名
 删除字段
 修改表名修改表结构语法结构
 • 基本用法
 – ALTER TABLE 表名 执行动作 ;
 知
 识
 讲
 解
 Add
 Modify
 Change
 Drop
 Rename
 添加字段
 修改字段类型
 修改字段名
 删除字段
 修改表名添加新字段
 • 基本用法
 知
 识
 讲
 解
 – ALTER TABLE 表名
 – ADD 字段名 类型 ( 宽度 ) 约束条件 ;
 可加 AFTER 字段名 ;
 或者 FIRST;修改字段类型
 • 基本用法
 知
 识
 讲
 解
 – ALTER TABLE 表名
 – modify 字段名 类型 ( 宽度 ) 约束条件 ;
 可加 AFTER 字段名 ;
 或者 FIRST;修改字段名
 • 基本用法
 知
 识
 讲
 解
 – ALTER TABLE 表名
 – change 源字段名 新字段名 类型 ( 宽度 ) 约束条件
 ;
 当跟新类型和约束条件时,也可修改字段类型删除字段
 • 基本用法
 知
 识
 讲
 解
 – ALTER TABLE 表名
 – drop 字段名 ;
 表中有多条记录时,所有列此字段的值都删除了修改表名
 • 基本用法
 知
 识
 讲
 解
 – ALTER TABLE 表名
 – Rename 新表名;
 表对应的文件名,也会改变案例 1 :修改表结构
 • 表的字段修改
 课
 堂
 练
 习
 – 添加字段
 – 修改字段名
 – 修改字段类型
 – 删除字段MySQL 键值
 MySQL 索引概述
 索引介绍
 索引优缺点
 MySQL 键值
 键值类型
 MySQL 键值类型
 INDEX 普通索引
 primary key 主键
 foreign key 外键MySQL 索引概述索引介绍
 • 索引是什么?
 知
 识
 讲
 解
 – 索引是对记录集的多个字段进行排序的方法。
 – 类似于书的目录
 – 索引类型包括 :Btree 、 B+tree 、 hash索引优缺点
 • 索引优点
 知
 识
 讲
 解
 – 通过创建唯一性索引,可以保证数据库表中每一行数
 据的唯一性
 – 可以加快数据的检索速度
 • 索引缺点
 – 当对表中的数据进行增加、删除和修改的时候,索引
 也要动态的维护,降低了数据的维护速度
 – 索引需要占物理空间键值类型
 • INDEX :普通索引
 • UNIQUE :唯一索引
 知
 识
 讲
 解
 • FULLTEXT :全文索引
 • PRIMARY KEY :主键
 • FOREIGN KEY :外键MySQL 键值类型INDEX 普通索引
 • 使用说明
 知
 识
 讲
 解
 – 一个表中可以有多个 INDEX 字段
 – 字段的值允许有重复,切可以赋 NULL 值
 – 经常把做查询条件的字段设置为 INDEX 字段
 – INDEX 字段的 KEY 标志是 MULINDEX 普通索引(续 1 )
 • 建表的时候指定索引字段
 – INDEX( 字段 1), INDEX( 字段 2) .. ..
 知
 识
 讲
 解INDEX 普通索引(续 2 )
 • 在已有的表中设置 INDEX 字段
 – CREATE INDEX 索引名 ON 表名 ( 字段名 );
 知
 识
 讲
 解
 • 删除指定表的索引字段
 – DROP INDEX 索引名
 ON 表名 ;INDEX 普通索引(续 3 )
 • 查看表的索引信息
 – SHOW INDEX FROM 表名 ;
 知
 识
 讲
 解
 使用 B 树算法primary key 主键
 • 注意事项
 知
 识
 讲
 解
 – 一个表中只能有一个 primary key 字段
 – 对应的字段值不允许有重复,且不允许赋 NULL 值
 – 如果有多个字段都作为 PRIMARY KEY ,称为复合主
 键,必须一起创建。
 – 主键字段的 KEY 标志是 PRI
 – 通常与 AUTO_INCREMENT 连用
 – 经常把表中能够唯一标识记录的字段设置为主键字段
 [ 记录编号字段 ]primary key 主键(续 1 )
 • 建表的时候指定主键字段
 – PRIMARY KEY( 字段名 )
 知
 识
 讲
 解primary key 主键(续 2 )
 • 在已有的表中设置 PRIMARY KEY 字段
 – ALTER TABLE 表名 ADD PRIMARY KEY( 字段名 );
 知
 识
 讲
 解
 • 移除表中的 PRIMARY KEY 字段
 – ALTER TABLE 表名 DROP PRIMARY KEY;
 移除主键前,如果有自增属性,必须先去掉foreign key 外键
 • 什么是外键?
 知
 识
 讲
 解
 – 让当前表字段的值在另一个表中字段值的范围内选择
 。
 • 使用外键的条件
 – 表的存储引擎必须是 innodb
 – 字段类型要一致
 – 被参照字段必须要是索引类型的一种 (primary key)foreign key 外键(续 1 )
 • 基本用法
 知
 识
 讲
 解
 – FOREIGN KEY( 表 A 的字段名 )
 References 表 B( 字段名 )
 ON UPDATE CASCADE
 ON DELETE CASCADEforeign key 外键(续 2 )
 • 删除外键字段
 – ALTER TABLE 表名 DROP FOREIGN KEY 约束名 ;
 知
 识
 讲
 解
 外键约束名称MySQL 索引创建与删除
 1. 普通索引、唯一索引、主键索引的创建 / 删除
 2. 自增主键索引的创建 / 删除
 课
 堂
 练
 习
 3. 建立员工表 yg 、工资表 gz ,并设置外键实现同步
 更新与同步删除总结和答疑
 primary key
 问题现象 1
 故障分析及排除
 问题现象 2
 故障分析及排除
 总结和答疑
 foreign key
 问题现象 1
 故障分析及排除
 问题现象 2
 故障分析及排除primary key问题现象 1
 • 把已有表中的字段设置为主键报错
 – 报错:
 知
 识
 讲
 解
 Duplicate entry '2' for key 'PRIMARY'
 mysql> select * from t1;
 | 2 | jerry |
 | 2 | bob |
 +------+-------+
 4 rows in set (0.01 sec)
 mysql>
 mysql> alter table t1 add primary key(id);
 ERROR 1062 (23000): Duplicate entry '2' for key 'PRIMARY'故障分析及排除
 • 原因分析
 – 不符合主键使用规则,主键字段的值不允许重复
 知
 识
 讲
 解
 • 解决办法
 – 修改字段的重复值
 mysql> update t1 set id=4 where name="jerry";
 .. ..
 mysql> alter table t1 add primary key(id);
 .. ..问题现象 2
 • 删除表中主键字段报错
 – 报错: ERROR 1075 (42000):
 知
 识
 讲
 解
 mysql> desc t2;
 +-------+----------+------+-----+---------+----------------+
 | Field | Type | Null | Key | Default | Extra
 |
 +-------+----------+------+-----+---------+----------------+
 | id
 | int(2)
 | NO | PRI | NULL | auto_increment |
 | name | char(10) | YES | | NULL |
 |
 +-------+----------+------+-----+---------+----------------+
 mysql> alter table t2 drop primary key;
 ERROR 1075 (42000): Incorrect table definition; there can be only
 one auto column and it must be defined as a key故障分析及排除
 • 原因分析:
 – 有自动增长属性的字段必须作为主键,不允许删除
 知
 识
 讲
 解
 • 解决办法:
 – 去掉字段的自动增长属性,再删除主键
 mysql> alter table t2 modify id int(2) not null;
 .. ..
 mysql> alter table t2 drop primary key;
 .. ..foreign key问题现象 1
 • 创建外键失败
 – 报错: ERROR 1215 (HY000): Cannot .. ..
 知
 识
 讲
 解
 mysql> desc t2 ;
 +-------+----------+------+-----+---------+-------+
 | id | int(2) | NO | | NULL |
 |
 | name | char(10) | YES | | NULL |
 |
 +-------+----------+------+-----+---------+-------+
 mysql> create table t3(
 -> id int(2),
 -> pay float(7,5),
 -> foreign key(id) references t2(id)
 -> );
 ERROR 1215 (HY000): Cannot add foreign key constraint故障分析及排除
 • 原因分析:
 知
 识
 讲
 解
 – 不符合外键使用规则。
 – 被参考字段必须是 key 值中的一种。
 • 解决办法:
 – 给被参考字段设置 key 值
 mysql> create index id on t2(id);
 mysql> create table t3( id int(2), pay float(7,5), foreign key(id)
 references t2(id) );
 .. ..问题现象 2
 • 删除表中字段失败
 – 报错: Cannot delete or update a parent row .......
 知
 识
 讲
 解
 mysql> drop table t2;
 ERROR 1217 (23000): Cannot delete or update a parent row: a
 foreign key constraint fails
 mysql> alter table t2 drop id;
 ERROR 1553 (HY000): Cannot drop index 'id': needed in a foreign
 key constraint故障分析及排除
 • 原因分析
 – 被参考的表、表的字段不允许被删除
 知
 识
 讲
 解
 • 解决办法
 – 删除其他表对待删除表或字段的参考
 mysql> alter table t3 drop foreign key t3_ibfk_1;
 .. ..
 mysql> alter table t2 drop id;
 .. ..