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. 对已经存在的表,如果作为主键的字段也以没有被创建,那么就可以 add 字段 类型 primary key [auto_increment] 直接完成部署,当然也是可以先什么都不设,先创建一个字段,然后再创建主键
           如果作为主键的字段也以被创建,创建主键的时候,格式是固定的,如果想和auto_increment连用,要先创建完主键,再用modify进行修改。

     4. 通常和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 外键约束名称;

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值