zoukankan      html  css  js  c++  java
  • 数据库与表的其他操作、字段的操作、数据类型、字段的约束条件

    数据库与表的其他操作、字段的操作、数据类型、字段的约束条件

    一、数据库配置

    统一字符编码

    # 通过配置文件统一配置的目的,统一管理服务端(mysqld)和客户端(client)
    # 如果配置了mysqld(服务端)的编码为utf8的话,那么再创建的数据库,默认编码格式都是utf8
    
    # 配置流程
    1、在mysql安装根目录下,创建my.ini配置文件
    2、设置配置文件内容并保存
    [mysqld]  # 代表服务器配置
    port=3306 # 修改数据库默认端口(如果数据库端口被其他软件占用的情况下)
    character-set -server=utf8  # 设置服务端编码为utf8
    collation-server=utf8_general_ci  # 排序方式(默认跟编码格式走)
    
    [client]  # mysql自己的客户端叫[mysql],配置了[client]即配置了[mysql],也配置了其他存在方式的客户端
    default-character-set=utf8  # 配置客户端编码为utf8
    3、重启数据库服务
    quit
    
    

    二、数据库修改信息

    修改字符编码
    mysql> alter database 数据库名 charset=编码格式;
    

    三、用户操作数据库(重点)

    # 为特定的数据库分配拥有该数据库操作权限的用户
    mysql> grant 权限们 on 数据库名.表名 to 用户名@'主机名' identified by '密码';
    
    # 以oldboy数据库为例
    # 1、all:所有权限
    # 2、oldboy.*: oldboy数据库下所有表
    # 3、oldboy@'localhost': 本机可以通过oldboy用户名登入
    # 4、identified by 'Oldboy123': 密码为Oldboy123
    eg> grant all on oldboy.* to oldboy@'localhost' identified by 'Oldboy123';
    
    # 1、select,delete,update,insert,drop,alter: 指定的权限
    # 2、oldboy.*: oldboy数据库下所有表
    # 3、oldboy@'%': 任何机器都可以通过oldboy用户名登入
    # 4、identified by 'Oldboy123': 密码为Oldboy123
    eg> grant select,delete,update,insert,drop,alter on oldboy.* to oldboy@'%' identified by 'Oldboy123';
    
    # 撤销权限
    mysql> revoke 权限1,权限2,.... on 数据库名.表名 from 用户名@'主机名';
    # 禁掉本地oldboy用户名对oldboy数据库的所有表的drop权限
    eg> revoke drop on oldboy.* from oldboy@'localhost';
    
    # 删除用户
    mysql> drop user 用户名@'主机名';
    

    四、表的修改

    修改表名
    mysql> alter table 旧表名 rename 新表名;
    
    修改字段名
    mysql> alter table 表名 change 旧字段名 新字段名 类型(长度);
    
    修改字段属性
    mysql> alter table 表名 modify 字段名 新类型(长度);
    
    清空表
    1、清空所有数据,但是会记录自增信息,效率低
    mysql> delete from 表名 [条件];
    eg> delete from t1;  # 没有给条件的情况下是清空所有数据,但会记录自增信息
    2、清空表,清空自增信息
    mysql> truncate table 表名;
    eg> truncate table t1;
    
    

    五、创建表的完整语法

    mysql> create table 表名(
    	属性名1 类型(长度) 约束,
    	........
    	属性名n 类型(长度) 约束,
    )engine=引擎 default charset=utf8;
    
    eg:create table db1.t1(name char(3) not null);
    # 这就规定了数据插入时,name不能为空(null),且最长只能存放三个字符
    # 总结:宽度和约束条件为可选参数,用来限制存放数据的规则
    

    六、数据库表的引擎:驱动数据的方式-数据库优化

    引擎是创建表的的时候规定的,提供给表使用的,不是数据库使用的

    mysql> show engines;  #  展示所有引擎
    
    # innodb(默认):支持事务,行级锁,外键,安全性高,效率低
    mysql> create table t1(id int)engine=innodb;  
    
    # myisam:查询效率优于innodb,当不需要支持事务,行级锁,外键时,可以通过设置myisam来优化数据库
    mysql> create table t2(id int)engine=myisam; 
    
    # blackhole:黑洞,存进去的数据都会消失(可以理解为不存数据)
    mysql> create table t3(id int)engine=blackhole;  
    
    # memory:表结构是存储在硬盘上的,但是表数据全部存储在内存中,重启数据库就消失
    mysql> create table t4(id int)engine=memory;  
    

    七、数据库的模式

    # mysql 5.7 版本之后默认都是安全模式
    
    # mysql 5.6 版本
    sql_mode: 反映数据库模式的全局变量
    # 数据库模式限制的是客户端对服务器操作数据的方式(是否严格)
    
    strict_trans_tables: 安全模式
    no_engine_substitution:非安全性,不设置安全模式的话就默认这个
    
    # 查看当前数据库模式:
    show variables like "%sql_mode%"; # %匹配0~n个任意字符 => 模糊查询
    
    # 设置为安全模式(临时设置),服务重启后会被重置
    set global sql_mode="strict_trans_tables";
    
    # 重启连接(客户端)    # 设置后必须断开数据库连接(服务器不重启)就会进入安全模式
    quit  
    
    # 应用举例,在安全模式下,所有非安全模式下sql执行的警告语句,都会抛异常
    create table t1(name char(2));
    insert into t1 values("ab");   # 正常
    insert into t1 values("owen");  # 在安全模式下会报错,超出了规定的长度2
    
    

    八、mysql支持的数据类型

    整型

    '''类型
    tinyint:1字节 -128 ~ 127 *  # 长度4
    smallint:2字节 -32768 ~ 32767  # 长度6
    mediumint:3字节
    int:4字节 -2147483648~2147483647 *  # 默认11位,正数的话只能是10位
    bigint:8字节
    '''
    
    '''约束 *
    unsigned:无符号
    zerofill:0填充
    '''
    
    # 建表
    mysql> create table tb1(x tinyint,y smallint,z int(6));
    # 插入数据
    mysql> insert into tb1 values(128,32768,32768);
    # 结果:127,32767,32768
    
    结论: 整型的长度由所占字节(取值范围)决定,可以自定义长度,但是不影响所占字节(取值范围),所有整型变量的长度一般都省略不写
    
    # 整型约束
    mysql> create table tb2(x tinyint unsigned);  # 无符号,就规定了没有负号,所以范围为:0~255 ,长度自动变为3
    
    # 0填充约束
    mysql> create table tb3(x tinyint unsigned zerofill);  # 长度不够用0填充
    mysql> insert into tb3 values(10); 
    结果:010  # 0填充在前面不影响数据大小
    
    

    浮点型

    '''类型
    float:4字节,3.4E–38~3.4E+38 *
    double:8字节,1.7E–308~1.7E+308
    decimal:M,D大值基础上+2
    '''
    '''宽度:
    限制存储宽度
    (M, D) => M为位数,D为小数位
    float(255, 30):精度最低,最常用
    double(255, 30):精度高,占位多
    decimal(65, 30):字符串存,全精度
    '''
    
    # 建表
    mysql> create table tb4(age float(256,30));  # 256超出了255的范围就报错,Display width out of range for column 'age' (max = 255)
    mysql> create table tb5(age float(255,31)); # 小数位长度31超出30就报错,Too big scale 31 specified for column 'age'. Maximum is 30.
    mysql> create table tb5(age float(65,30)); # 在合理取值范围,就是对的
    
    # 限制存储宽度
    mysql> create table t12(x float(255,30));   # 精度最低
    mysql> create table t13(x double(255,30));  # 精度高
    mysql> create table t14(x decimal(65,30));  # 全精度
    # 插入数据
    mysql> insert into t12 values(1.11111111111111111119); # 结果是1.111111164093017600000000000000 
    mysql> insert into t13 values(1.11111111111111111119); # 结果是1.111111111111111200000000000000
    mysql> insert into t14 values(1.11111111111111111119); # 结果是1.111111111111111111190000000000
    
    # 重点:长度与小数位分析
    mysql> create table t14(x decimal(2,3));  # 报错,总长度M必须大于等于小数位D
    mysql> create table t14(x decimal(3,3));  # 整数位 3 - 3,所以最大为0  # 能存储,-0.999 ~ 0.999,超长度的小数位才会有四舍五入,0.9994可以存,就是0.999,0.9995不可以存  
    mysql> create table t14 (x decimal(4, 3)); # 整数位 4 - 3,所以最大为9  # 能存储 -9.999 ~ 9.999,超长度的小数位会才有四舍五入,9.9994可以存,就是9.999,9.9995不可以存
    mysql>: create table t14 (x decimal(5, 3));  # 整数位 5 - 3,所以最大为99  # 能存储 -99.999 ~ 99.999,超长度的小数位会才有四舍五入,99.9994可以存,就是99.999,99.9995不可以存
    

    字符串型:数据库优化-char效率要高于varchar

    '''类型
    char:定长
    varchar:不定长
    '''
    '''宽度
    限制存储宽度
    char(4):以4个字符存储定长存储数据,存 "a" "ab" "abc" "abcd"都采用4个长度,"abcde" 只能存储前4位(安全模式下报错)
    varchar(4):数据长度决定字符长度,为可变长度存储数据,存 "a" "ab" "abc" "abcd"分别采用1,2,3,4个长度存储,"abcde" 只能存储前4位(安全模式下报错)
    '''
    
    '''重点: 存储数据的方式 **  => 数据库优化
    char就按定长存储,如果数据长度变化大,通常更占空间,但是存取数据按固定定长操作,效率高
    varchar存储数据时,会先计算要存储数据的长度,动态变长存储数据,所以一般较省空间,但是计算是需要耗时的,所以效率低
    
    varchar计算出的数据长度信息也是需要开辟空间来存储,存储在数据头(数据开始前)中,也需要额外消耗1~2个字节
    所以如果数据都是固定长度,或是小范围波动,char相比就不会更占空间,且效率高
    '''
    
    # 建表
    mysql> create table ts1(s1 char(4),s2 varchar(4));
    # 插入数据
    mysql> insert into ts1 values('abcde','xyzabc'); # 结果是'abcd','xyza'
    
    

    时间类型

    '''类型
    year:yyyy(1901/2155)
    date:yyyy-MM-dd(1000-01-01/9999-12-31)
    time:HH:mm:ss
    datetime:yyyy-MM-dd HH:mm:ss(1000-01-01 00:00:00/9999-12-31 23:59:59)
    timestamp:yyyy-MM-dd HH:mm:ss(1970-01-01 00:00:00/2038-01-19 ??)
    '''
    
    # 建表:
    mysql>: create table td1 (my_year year, my_date date, my_time time);
    mysql>: insert into td1 values(1666, '8888-8-8', '8:8:8');  # 时间需要在取值访问内
    
    mysql>: create table td2 (my_datetime datetime, my_timestamp timestamp);   
    mysql>: insert into td2 values('2040-1-1 1:1:1', '2040-1-1 1:1:1');  # 时间需要在取值访问内   
    mysql>: insert into td2(my_datetime) values('2040-1-1 1:1:1');  # timestamp不复制会才有系统当前时间
    
    # datetime:8字节,可以为null
    # timestamp:4字节,有默认值CURRENT_TIMESTAMP
    

    枚举和集合类型

    是为某一个字段提供选项的,枚举只能单选(1个),集合可以多选(0-n个)
    '''类型
    enum:单选
    set:多选
    '''
    
    # 建表
    # enum、set默认值为NULL
    mysql> create table tc1(name varchar(20),sex enum('男','女','哇塞'),hobbies set('男','女','哇塞'));
    mysql> insert into tc1 values('ruakei','哇塞哇塞','未知');
    
    # enum、set手动设置默认值'男'与'哇塞'
    mysql> create table tc2(name varchar(20),sex enum('男','女','哇塞') default '男',hobbies set('男','女','哇塞') default '哇塞');
    mysql> insert into tc2 values('ruakei','哇塞哇塞','未知');
    mysql> insert into tc2(name) values('ruakei');  # 插入指定name字段的数据,别的用默认值
    
    # 对sex、hobbies两个字段赋值错误,系统默认用空字符串填充(非安全模式),安全模式抛异常
    # 如果对除sex、hobbies两个字段外的其他字段进行赋值,这两个字段才会有默认值
    
    
    # 注:对set类型的字段进行赋值,用一个字符串,字符串内部用逗号将多个选项隔开,且不能添加空格等其他额外字符
    mysql> insert into tc2 values('ruakei_1','女','男,女,哇塞');
    
    1gb = 1024mb = 1024^2kb = 1024^3b = 1024^3*8数字
    

    九、约束条件(重要)

    """
    primary key:主键,唯一标识,表都会拥有,不设置为默认找第一个 不空,唯一 字段,未标识则创建隐藏字段
    foreign key:外键
    unique:唯一性数据, 该条字段的值需要保证唯一,不能重复
    
    auto_increment:自增,只能加给key的int类型字段,作为辅助修饰,一个表中只能设置一个自增字段
    
    not null:不为空 - 针对一些字段,如注册时的用户名,出生人的性别等,这些需求下的字段,值不能设置为Null,必须要对其赋值
    default:默认值 - 对有默认值以外的字段进行赋值时,有默认值的字段会被赋默认值
    
    unsigned:无符号 - 存储的数字从0开始
    zerofill:0填充 - 存整数时数据长度小于取值范围长度,会在数字左方用0填充
    """
    
    # not null 与 default 限制
    # 不能为空,没有默认值的x,必须赋值
    # y、z在没有赋值情况下,才有默认值,设置值后,采用默认值
    mysql>: create table td1 (x int not null, y int default 0, z int default 100);
    
    # 报错,auto_increment必须设置给 键字段
    mysql>: create table td2 (x int auto_increment);
    # 报错,auto_increment必须设置给 int字段
    mysql>: create table td2 (x char(4) auto_increment);
    # 报错,auto_increment字段最多出现 1次
    mysql>: create table td2 (x int unique auto_increment, y int unique auto_increment);
    
    # 正确,主键和唯一键分析
    # x为主键:没有设置primary key时,第一个 唯一自增键,会自动提升为主键
    mysql>: create table td21 (x int unique auto_increment, y int unique);
    # y为主键:没有设置primary key时,第一个 唯一自增键,会自动提升为主键
    mysql>: create table td22 (x int unique, y int unique auto_increment);
    # x为主键:设置了主键就是设置的,主键没设置自增,那自增是可以设置在唯一键上的
    mysql>: create table td23 (x int primary key, y int unique auto_increment);
    # x为主键:设置了主键就是设置的,主键设置了自增,自增字段只能有一个,所以唯一键不能再设置自增了
    mysql>: create table td24 (x int primary key auto_increment, y int unique);
    # 默认主键:没有设置主键,也没有 唯一自增键,那系统会默认添加一个 隐式主键(不可见)
    mysql>: create table td25 (x int unique, y int unique);
    
    # 唯一键:确保一个字段,数据不能重复
    # 主键:是一条记录的唯一标识(可以理解为数据的编号)
    
    # 联合唯一
    # ip在port不同时,可以相同,ip不同时port也可以相同,均合法
    # ip和port都相同时,就是重复数据,不合法
    mysql>: create table tu1 (ip char(16), port int, unique(ip, port));
    
    # 也可以设置成 联合主键,道理同 联合唯一
    mysql>: create table tu2 (ip char(16), port int, primary key(ip, port));
    # sql可以多行书写
    mysql>: 
    create table t22(
    	ip char(16),
        port int,
        primary key(ip,port)
    );
    
    
    
  • 相关阅读:
    NBUT 1120 Reimu's Teleport (线段树)
    NBUT 1119 Patchouli's Books (STL应用)
    NBUT 1118 Marisa's Affair (排序统计,水)
    NBUT 1117 Kotiya's Incantation(字符输入处理)
    NBUT 1115 Cirno's Trick (水)
    NBUT 1114 Alice's Puppets(排序统计,水)
    188 Best Time to Buy and Sell Stock IV 买卖股票的最佳时机 IV
    187 Repeated DNA Sequences 重复的DNA序列
    179 Largest Number 把数组排成最大的数
    174 Dungeon Game 地下城游戏
  • 原文地址:https://www.cnblogs.com/zhuangyl23/p/11575472.html
Copyright © 2011-2022 走看看