• 数据库表的具体操作


    数据库表的具体操作

    1、数据类型

    建表的时候,字段都有对应的数据类型

    • 整型
    • 浮点型
    • 字符类型char与varchar
    • 日期类型
    • 枚举与集合

    2、约束条件

    • primary key
    • unique
    • not null
    • default

    1、存储引擎(可选讲)

    1.MySQL存储引擎

    • innodb: 默认存储引擎
    • myisam: MySQL老版本在用的存储引擎
    • blackhole: 存任何数据,都会立即消失,相当于经过队列,数据取出就消失了
    • memory: 内存引擎(数据存放在内存中)

    2.查看所有存储引擎

    • show engines;
      • 截图介绍存储引擎的翻译
      • 详细介绍innoDB
        • 支持事物
        • 支持行锁
        • 支持外键

    3.查看不同存储引擎存储表结构文件特点

    注意: 插入数据并演示结果

    • 插入4种不同的存储引擎表:
    • 插入后查看文件产生介绍
      • create table t1(id int)engine=innodb;
      • create table t2(id int)engine=myisam;
      • create table t3(id int)engine=blackhole;
      • create table t4(id int)engine=memory;
    • 插入数据
      • insert into t1 values(1);
      • insert into t2 values(1);
      • insert into t3 values(1);
      • insert into t4 values(1); 这个需要内存中还有,需要关掉服务端才能销毁清除。

    2、创建表的完整语法

    create table 表(
      字段名1 字段类型(宽度) 约束条件,
      字段名2 字段类型(宽度) 约束条件,
    );
    
    1.宽度指的是对存储数据的限制
    create table userinfo(name char);
    insert into userinfo values('tank');
    '''
    1)没有安全模式的数据库版本,能够存放数据但只存存进去一个t。
    2)最新数据的版本直接报错提示无法储存: Data too long for column 'name'
    '''
    
    2.约束条件初识: null 与 not null
    create table t1(id int, name char not null);
    # 正常存储
    insert into t1 values(1, 't');
    # 报错
    insert into t1 values(2, null);
    
    
    # 注意
    # 1.字段名 与 字段类型 都是必须的,宽度和约束条件可选
    create table t1(id);
    
    # 2.同一张表中字段名不能重复
    create table t1(
    	id int,
    	id int  # 报错
    );
    
    # 3.最后字段后面不能加逗号
    create table t1(
      id int,
    	name char,  # 报错      
    );  
    
    '''
    总结: 类型与约束条件区别
    		类型: 限制字段必须以什么样的数据类型存储
    		约束条件: 约束条件是在类型之外添加一种额外的限制
    '''
    

    3、基本数据类型

    1)整型

    1.介绍

    2.验证整型字段有无符号及范围

    # TINYINT
    01) 默认有正负符号限制:
    create table t2(id TINYINT);
    desc t2;
    
    # 超出限制, 插不进去
    insert into t2 values(-129), (256);
    
    # 默认范围是(-128, 127)
    insert into t2 values(-128), (127);
    select * from t2;
    
    02) 无正负符号限制: unsigne
    create table t3(number tinyint unsigned);
    # 报错
    insert into t3 values(-10);  
    insert into t3 values(127);
    
    
    # INT: int默认最大展示的位数是11位
    create table t4(id int);
    # 默认范围是(-2147483648, 2147483647)
    insert into t4 values(-2147483648), (2147483647);
    # 超出默认范围
    insert into t4 values(-2147483648), (122412451251251);
    
    # 问题: 整型后的宽度能否改变字段存储的大小?
    # create table t5(number int(10));
    
    # int(8)不是限制长度,而是控制展示数据的位数,8位以内以空格补全,超出则正常显示。
    create table t5(id int(8));
    insert into t5 values(2147483647);
    select * from t5;
    +------------+
    | id         |
    +------------+
    | 2147483647 |
    |      21474 |
    +------------+
    
    # 显示不够8位用0补全, 并且只能插入无符号的值
    create table t6(id int(8) unsigned zerofill);
    +----------+
    | id       |
    +----------+
    | 42949672 |
    | 00429496 |
    +----------+
    
    '''
    总结:
    		- 注意1:
    			- not null: 字段值不能为空
    			- unsigned: 无正负符号
    			- 0填充空格
    '''
    

    2)浮点型

    1.介绍

    • 分类: float、double、 decimal
    • 应用场景: 身高、体重、薪资
    • 三者最大的区别
    注意: 字段限制特点(5,3)前一位表示所有的位数,后一位表示小数个数。
    
    # 存储限制:
    	- float(255, 30)
    	- double(255, 30)
    	- decimal(65, 30)
    
    # 精确度验证:
    create table t7(x float(255, 30));
    create table t8(x double(255, 30));
    create table t9(x decimal(65, 30));
    
    insert into t7 values(1.1111111111111111111111111111);
    insert into t8 values(1.1111111111111111111111111111);
    insert into t9 values(1.1111111111111111111111111111);
    

    3)字符类型

    • 分类:varchar 、char
    • 应用场景: 姓名、地址、描述信息

    1.char: 定长

    # 超出四个字符报错,不够四个字符空格不全
    create table t10(name char(4));
    # 报错
    insert into t10 values('hello');
    insert into t10 values('tank');
    insert into t10 values('lol');
    

    2.varchar: 不定长

    # 超出4个字符报错,不够四个有几个存几个
    create table t11(name varchar(4));
    # 报错
    insert into t10 values('hello');
    insert into t11 values('tank');
    insert into t11 values('lol');
    

    3.char类型特点

    # 注意: 无法查看字符真实长度
    # 针对char类型,mysql在存储时会将数据用空格补全存放到硬盘中。但是会在读出结果的时候自动去掉末尾的空格。
    select char_length(name) from t10;
    select char_length(name) from t11;
    

    4.char与varchar比较

    '''
    - char:
    	- 1.浪费空间
    	- 2.存取速度快
    		比如: 
    			char(6): tank, jason, sean, oscar  都是6个字符
    	
    - varchar:
    	- 1.节省空间
    	- 2.存取速度慢
    		比如:
    			varchar(6): 1bytes+tank 1bytes+jason
    '''
    

    4)日期类型

    • 分类:
      • date: 2019-12-10
      • time: 11:11:11
      • datetime: 2019-12-10 11:11:11
      • year: 2019
    create table teacher(
    	id int,
      name varchar(16),
      born_yeae year,
      birth date,
      work_time time,
      register_time datetime
    );
    
    insert into teacher values(1, 'tank', '2019', '2019-12-05','11:11:11', '2019-12-05 11:11:11');
    
    select * from teacher;
    

    5)枚举与集合类型

    • 分类:
      • 枚举enum 多选一
      • 集合set 多选一 或 多选多
    # 枚举
    create table user1(
    	id int,
      name varchar(16),
      gender enum('male', 'female', 'others')
    );
    
    # 报错
    insert into user1 values(1, 'sean', '人妖');
    # 正确
    insert into user1 values(1, 'jason', 'others');
    
    
    # 集合
    create table user2(
    	id int,
      name varchar(16),
      gender enum('male', 'female', 'others'),
      hobbies set('read', 'sleep', 'play ball', 'run')
    );
    
    # 多选一
    insert into user2 values(1, 'tank', 'male', 'read');
    
    # 多选多
    insert into user2 values(2, 'jason', 'female', 'read,sleep');  # 注意: read,sleep必须连着写
    
    

    4、约束条件

    约束条件就是,对于数据库表插入数据时加以约束限制。

    1)约束条件介绍

    - primary key (pk)
        标识该字段为该表的主键,主键可以是唯一的表示记录
        
    - foreign key (fk)
        标识该字段为该表的外键
    
    - not null
        标识该字段不能为空
    
    - unique key (uk)
        标识该字段的值是唯一的
    
    - auto_increment
        标识该字段的值自动增长 (整数类型,并且为主键)
    
    - default
        为该字段设置默认值
    
    - unsigned
        无正负符号
    
    - zerofill
        使用0填充空格
    

    2)not null + default

    create table user3(
    	id int,
        name varchar(16)
    );
    
    # 值可以插入空值
    insert into user3 values(1, null);
    
    # not null
    # 不可设置为None
    create table user4(
    	id int,
      name varchar(16) not null
    );
    # 报错
    insert into user4 values(1, null);
    insert into user4 values(1, 'tank');
    
    # 插入数据时可以在表后指定插入数据对应的字段名
    insert into user4(id, name) values(2, 'jason');
    insert into user4(name, id) values('sean', 3);
    
    
    # not null + default
    create table student(
    	id int,
      name varchar(16) not null,
      gender enum('male', 'female', 'others') default 'male'
    );
    
    insert into student(id, name) values(1, 'tank');
    insert into student(id, name, gender) values(2, 'jason', 'female');
    
    

    3) unique 唯一

    限制字段值是唯一的

    # 单列唯一
    create table user5(
    	id int unique,
      name varchar(16)
    );
    insert into user5 values(1, 'tank');
    # 若id已存在则报错
    insert into user5 values(1, 'jason');
    
    # 联合唯一
    create table user6(
    	id int,
      name varchar(16),
      unique(id, name)
    );
    
    insert into user6 values(1, 'tank');
    insert into user6 values(2, 'tank');
    insert into user6 values(2, 'jason');
    # 若id与name联合存在则报错
    insert into user6 values(1, 'tank');
    

    4) primary key + auto_increment: 主键+自增

    # 约束角度: primary key  == not null + unqiue
    create table user7(
    	id int primary key
    );
    
    # 唯一
    insert into user7 values(1);
    insert into user7 values(1);
    
    # 不能为空
    insert into user7 values(null);
    
    # 注意: primary key 除了约束之外,它还是innodb引擎组织数据的一句,提升查询效率
    
    # 强调:
    '''
    		1.一张表必须只有一个主键,如果没有设置主键,会从上到下搜索,直到遇到 "第一个"非空且唯一的字段自动设置为主键。
    '''
    create table user8(
    	id int,
      name varchar(16),
      age int not null unique
    )engine=innodb;
    
    desc user8;
    
    '''
    		2.如果包里没有指定任何可以设置主键的字段,那innodb会采用自己默认的一个隐藏关键字作为主键,隐藏意味着查询你的时候通过这个加速查询。
    		索引: 类似于书的目录, 没有主键就相当于一页一页翻着查询。
    
    		3.一张表中通常都应该有一个id字段,并且通常将id字段作为主键。
    '''
    
    # 联合主键: 多个字段联合起来作为一个主键,本质上还是一个主键
    create table user9(
    	id int,
    	name varchar(16),
    	primary key(id, name)
    );
    desc user9;
    
    # 主键id作为数据的编号,应该设置为自动递增
    create table user10(
    	id int primary key auto_increment,
      name varchar(16)
    );
    desc user10;
    
    insert into user10(name) values('tank');
    insert into user10(name) values('sean'),('jason'),('大饼');
    
    
     # 若想自增从指定值开始,可插入第一条数据时先指定id的值;
                    insert into user4(id, name) values(10, 'tank');
                    insert into user4(name) values('sean');  # 11
                    insert into user4(name) values('egon');  # 12
                    insert into user4(name) values('大鸡哥');  # 13
                    
                    
    
    # 注意: auto_increment通常加在主键上,并且只能设置给primary key字段。
    
    # 补充:
    delete from user10;
    # delete删除表的记录或者指定记录,但id不会重置为0
    # 删除某一条记录
    delete from user10 where id='4';
    
    # 若想要清空id重置为0,可使用truncate user10;
    

    5、设置严格模式

    # 查看数据库配置中变量名包含mode的配置参数:
    show variables like "%mode%";
    
    # 修改安全模式:
    set session;  # 局部有效,只在你当前操作的窗口有效
    set global session;  # 全局有效,永久有效
    
    # 修改完之后退出当前客户端重新登录即可
    set global sql_mode = 'STRICT_TRANS_TABLES';
    
  • 相关阅读:
    关于 MySQL int tinyint 类型的那点事
    PHP日期、时间戳相关的小程序
    [leedcode 236] Lowest Common Ancestor of a Binary Tree
    [leedcode 235] Lowest Common Ancestor of a Binary Search Tree
    [leedcode 234] Palindrome Linked List
    [leedcode 233] Number of Digit One
    [leedcode 232] Implement Queue using Stacks
    [leedcode 231] Power of Two
    [leedcode 230] Kth Smallest Element in a BST
    [leedcode 229] Majority Element II
  • 原文地址:https://www.cnblogs.com/godlover/p/12023955.html
Copyright © 2020-2023  润新知