Linux数据库管理——day2——基本约束、主外键

使用时间函数获得函数

now() 获得当前时间的日期 对应datatime类型
year(字符串) 获得后面字符串中指定的年 对应year类型
month(字符串) 获得后面字符串中指定的月
date(字符串) 获得后面字符串中指定的日 对于date类型
time(字符串) 获得后面字符串中指定的时间 对于time类型
sleep(数字) 命令休眠多少秒后执行
curdate() 单独获取当前日期 对于他date类型
curtime() 单独或等当前系统的时刻 对于time类型


  在没有对timestamp类型数据赋值的时候,会自动拿系统当前时间进行赋值
  而没有datetime类型赋值的时候,会自动赋空值null


约束(在创建表的时候,写在表类型后面,空格隔开,可以有多个约束,约束间也是用空格分隔)

null 设置该列能否空(就是什么都没有,用null标示) 默认允许赋null值   
赋值方法 直接在创建表的类型后面空格写上 可以写no null或者null或者不写
如果写not null,代表允许赋null值
如果什么写代表null,代表不允许赋null值
key 键值类型 普通索引(index) desc查询的KEY标志:MUL
唯一索引(unique)
全文索引(fulltext)
主键(primary key) desc查询的KEY标志:PRI
外键(foreign key)  
Default 默认值 当不被字段赋值时,使用默认值给字段赋值
不设置默认值时候 系统定义的是null
赋值方法 default  (值,也可以是,用逗号隔开多个值)
Extra 额外设置 字段是否设置为自动增加,默认没有自动增长功能

注:
    1. 如果出现null,其在表中作为值代表空,而"null"代表这四个字母
    2. 不管是什么情况,只要值的类型是字符串,就必须用引号引起来,一个值放在一个引号下,多个值用多个引号,然后之间用逗号隔开
    3. 在决定能不能输入相同值或者空值的时候是所有约束信息共同作用,一个不允许就某个做法不成立
    4. 如果查看的时候横着看不方便可以在后面加  \G  让输出竖着排列,一行数据一个模块,一个模块中有相应的每个字段数据


修改表结构

   alter  table  库.表  执行动作

  执行动作:
      添加新字段:

add 字段名  类型(宽度)  [ 约束条件]  [after 已有字段 | first]
# 给表新建一个字段,如果要约束就写,没有就不写
# 如果要选定字段位置,就用  after+放在哪个字段后面  ,如果想放在最前面就用  first 。

      修改某个字段:

modify 字段名  类型(宽度)  [ 约束条件] [after 已有字段 | first]
# 如果有不想修改的信息,必须原样抄过来,不然会变成默认值
# 修改时不能与已经存储的数据矛盾的话不允许修改
# 调整位置,就是把类型约束原样写下,然后写  after+想换到的位置

      调整字段名:

change  原字段名  新字段名

      删除已有字段:

drop   字段名
# 可是数据也会被删了,所以要慎重
# 可以删多行 --> alter table 库.表 drop 字段, drop字段

   注: 上面写的都是执行动作,前面都要加上 ' alter table 库.表  ' 这样命令才完整

      修改表名:

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

键值:
   作用: 限制赋值、给字段值排队
普通索引(INDEX):
   KEY标志: MUL
   作用: 对记录集的多个字段进行排序,没有限制赋值的作用
   类型包括: Btree、B+tree、bash
   默认算法: Btree(二叉树算法),算法逻辑就是用二分法把数据进行分组形成树,树的中序编历值是从小到大排列的,叶子就是具体值;其最大缺点就是修改表的速度会降低,然后存储空间也会变大;最大的优点就是查询速度块,因为查询效率优先级高于存储效率,所以所以应用广泛
   注意:
     1. 一个可以有多个索引字段;
     2. 索引的字段内的值允许重复、为空
     3. 索引只有用户进行筛选数据的时候在发挥作用,
        意思就是 select * from 表  的时候顺序是存储的顺序,
        只有  select * from 表 where 条件   的时候索引的排序才发挥作用

   查看:

# 看第四列key列 是MUL代表普通索引
desc  表名;
# 查看详细信息
show  index  from  表名\G;
# 查看某个select语句也没有使用索引,如果显示行数小于总行数,或者EXTRA是using,代表用了索引
explain select ……(命令内容)

   创建

# 在已有表创建(一般索引名和字段名设一样)
create  index  索引名  on  表名(字段名);
# 建表是时创建
create  table  表名(
字段1的具体信息配置,
……
字段n的具体信息配置,
index(字段名1),……,index(字段名n)
);

   删除(用show命令查索引名字,一般和字段重名)

drop  index  索引名  on  表名;

主键(primary key):
   KEY标志: PRI
   特点:主键是表中唯一能标识记录的字段,一个表中只能有一个primary key字段,不允许重复和赋空值。

   注意:
     0. 主键,一定是唯一且非空的!!
         当是复合主键的时候,只要主键中的多个字段不同时完全相同即可,也就是说只要复合主键中多个字段中的一个字段不同即可创建成功
         但是不管是不是复合主键,任何情况,作为主键中的任意一个字段都不能为空

     1. 一个primary key字段可以由一个表字段,也可以由多个表字段组成,如果由多个字段组成,则称之为复合主键,不过必须一起创建。但是创建复合主键,不能直接在字段后面加上primary key ,而只能在全部字段创建后一起定义

     2. 通常把表中唯一标示的字段作为主键字段,通常设编号为主键

     3. 通常和AUTO_INCREMENT连用,这样可以让主键在有新数据的时候,自动加1进行填充,这样就算填写数据的时候没有写,也不会报错,当然也可以手动赋值(必须符合所有的约束条件)。
  如果主键是数字,那么每次创建数据的时候如果没有定义主键值,那么自己生成的 主键序号=历史最大主键序号+1 ,
例子:假如现在数据库设置了主键是int,然后已经创建了5行数据主键分别是1、2、3、4、5
   如果这时候创建一行数据没有定义主键,主键就是6。
   如果这时候删除最后一行(主键为5那行),再创建一行数据,新一行主键默认还是6。
   如果这时候新加一行定义主键为10,然后再创建一行数据,新一行主键默认为11。

   创建

# 在已有表创建(如果写一个字段就是普通主键,写多个字段就是复合主键)
alter table 表名 add primary key(字段1,……,字段n);
# 建表是时创建
create  table  表名(
字段1的具体信息配置,
……
字段n的具体信息配置,
primary key(字段名1,……,字段名n)
);
# 也可以这么写,当然主键字段不一定要连续
create  table  表名(
做主键的字段1的具体信息配置 primary key,
做主键的字段2的具体信息配置 primary key,
……
做主键的字段m的具体信息配置 primary key,
字段m+1的具体信息配置,
……
字段n的具体信息配置,
primary key(字段名1,……,字段名n)
);

   创建编号作为主键和AUTO_INCREMENTl的连用的配置命令:

create  table  表名(
做主键的字段1的具体信息配置 primary key AUTO_INCREMENTl,
……
字段n的具体信息配置
);

   删除某表的主键:

alter table 表名 drop primary key;
# 如果删除的主键和AUTO_INCREMENTl连用了,就在删除前,删除一个约束
# alter table 表名 modify 字段 该字段原有的信息 not null;

外键(foreign key)
   作用:让当前表字段的值在另一个表中字段值的范围内选择
   条件:
     1. 表的存储引擎必须是innodb;
     2. 两边的字段类型必须要一致;
     3. 被参照字段必须要是唯一索引,不一定是主键,不过主键一定是可以作为被参考字段的
   注意:
     1. 如果创建外键的时候有 on update cascade on delete cascade 代表同步更新与删除,如果修改或删除被参考表中的被参考字段,外键所在表的数据也会随着该表
     2. 被参考表创建后必须有engine=innodb
     3. 外键也具有唯一性,只要被参考字段拥有非空性,就可以把外键设置为主键,具体就可以仿照已经创建表添加主键的操作

   查看

show create table 表名\G;
# 里面一行数据如下
CONSTRAINT `外键约束名称` FOREIGN KEY (`外键的字段名`) 

   创建

# 新创建的表
create  table  表名(
字段1的具体信息配置,
……
字段n的具体信息配置,
foreign key(自己表中作为外键的字段) references 被参照表(被参照字段) on update cascade on delete cascade
)engine=innodb;
# 已经创建的表(不过这个表引擎一定是innodb)
alter table 表名 add foreign key(自己表中作为外键的字段) references 被参照表(被参照字段) on update cascade on delete cascade;

  删除(要查看外键详细详细,才能得到外键约束名称)

alter table 表名 drop foreign key 外键约束名称;

猜你喜欢

转载自blog.csdn.net/Yu1543376365/article/details/83099644