• MySQL常用数据类型


    1.常用数据类型:

    (1)tinyint(小整型值): 1个字节,有符号的范围是(-128~127),无符号(unisigned)的范围是(0~255)

    (2)int (大整型值):4个字节,有符号的范围是(-21亿~21亿左右),无符号的范围是(0~42亿左右)

    (3) 浮点型:

    float(255,30): 单精度,总长度是255,小数位是30

    double(255,30): 双精度,总长度是255,小数位是30

    decimal(65,30):金钱类型,总长度是65,小数位是30

    可以设置总长度和小数位:create table t3(f1 float(5,2) , f2 double(5,2) , f3 decimal(5,2));

     

    默认状态下,float默认保留5位小数,double默认保留16位小数,decimal默认保留四舍五入后的整数位。

    create table t5(f1 float,f2 double,t3 decimal);

     

    (4)字符串:

    char(10) : 固定长度,最大长度为255,固定开辟10个字符长度的空间(手机号,身份证号),char开辟空间的速度更快

    varchar(11):不固定长度,最大长度为21845,最多创建字符长度为11位的空间(小评论),开辟空间速度较慢,但是节约内存

    text:文本类型(文章,小说)

    create table t9(a char(11) , b varchar(20) , c text);

    insert into t9 values("111","小评论","评论多多");

     

    (5) 枚举enum:从列出来的数据当中选一个,如性别

    (6) 集合set:从列出来的数据中选多个(注意去重性)

    create table t12(
    -> id int,
    -> name char(10) ,
    -> money float(6,2) ,
    -> sex enum("man","women") ,
    -> hobby set("reading","run","walk")
    -> );

     

     insert into t12 (id,name,money,sex,hobby) values(1,"bob",10.9,"man","run,run,walk");

    mysql> select * from t12;
    +------+------+-------+------+----------+
    | id | name | money | sex | hobby |
    +------+------+-------+------+----------+
    | 1 | bob | 10.90 | man | run,walk |
    +------+------+-------+------+----------+

     

    (7)时间类型:

    date: YYYY-MM-DD
    time: HH:MM:SS
    year: YYYY
    datetime:YYYY-MM-DD HH:MM:SS
    create table t1(f1 date,f2 time,f3 year,f4 datetime); (创建表格)
    insert into t1 values("2018-07-05","12:38:40","2018","2018-07-05 12:38:40"); (添加数据)
    insert into t1 values(now(),now(),now(),now());  (也可以使用MySQL自带的now()函数添加系统当前时间,MySQL会自动根据时间类型切断截取)

    mysql> select * from t1;
    +------------+----------+------+---------------------+
    | f1 | f2 | f3 | f4 |
    +------------+----------+------+---------------------+
    | 2018-07-05 | 12:38:40 | 2018 | 2018-07-05 12:38:40 |
    | 2020-06-17 | 14:42:08 | 2020 | 2020-06-17 14:42:08 |
    +------------+----------+------+---------------------+

    
    
    timestamp YYYYMMDDHHMMSS(自动更新时间)
    create table t2(dt datetime,ts timestamp);
    insert into t2 values(null,null);
    mysql> select * from t2;
    +------+---------------------+
    | dt | ts |
    +------+---------------------+
    | NULL | 2020-06-17 14:51:14 |
    +------+---------------------+
    insert into t2 values(20180705123840,20200617092430);
    mysql> select * from t2;
    +---------------------+---------------------+
    | dt | ts |
    +---------------------+---------------------+
    | NULL | 2020-06-17 14:51:14 |
    | 2018-07-05 12:38:40 | 2020-06-17 09:24:30 |
    +---------------------+---------------------+
    insert into t2(dt) values(now());
    mysql> select * from t2;
    +---------------------+---------------------+
    | dt | ts |
    +---------------------+---------------------+
    | NULL | 2020-06-17 14:51:14 |
    | 2018-07-05 12:38:40 | 2020-06-17 09:24:30 |
    | 2020-06-17 14:53:03 | 2020-06-17 14:53:03 |
    +---------------------+---------------------+
     
    约束:对要编辑的数据类型进行类型约束,不符合条件的直接报错
    (1) unsigned:无符号
    create table t3(id int unsigned);
    insert into t3 values(66);
    insert into t3 values(-55); # error

    (2) not null: 设置不为空
    create table t4(id int not null,name char(4));
    insert into t4 values(1,"bob");
    insert into t4(name) values("jack"); # ERROR 1364 (HY000): Field 'id' doesn't have a default value

    (3) default: 设置默认值
    create table t5(id int,name char(4) default "bob");
    insert into t5(id) values(1);
    insert into t5 values(2,"jack");
    mysql> select * from t5;
    +------+------+
    | id | name |
    +------+------+
    | 1 | bob |
    | 2 | jack |
    +------+------+

    (4) unique: 唯一约束,限定数据不能重复,UNI表示唯一索引 , 但是允许塞null空值
    create table t6(id int unique,xuehao int(8));
    insert into t6 values(1,111);
    insert into t6 values(2,111);
    insert into t6 values(null,111);
    insert into t6 values(null,222);
    insert into t6 values(1,222); # ERROR 1062 (23000): Duplicate entry '1' for key 'id'

    (5) primary key: 主键(PRI),标记数据的唯一特征,唯一且不为空
    create table t7(id int primary key,xuehao int(8));
    insert into t7 values(1,111);
    insert into t7 values(1,222); # ERROR 1062 (23000): Duplicate entry '1' for key 'PRIMARY'
    insert into t7 values(null,333); # ERROR 1048 (23000): Column 'id' cannot be null
    mysql> desc t7;
    +--------+---------+------+-----+---------+-------+
    | Field | Type | Null | Key | Default | Extra |
    +--------+---------+------+-----+---------+-------+
    | id | int(11) | NO | PRI | NULL | |
    | xuehao | int(8) | YES | | NULL | |
    +--------+---------+------+-----+---------+-------+
    # 如果primary key和unique not null两个约束同时存在,以primary key为主键,unique not null为UNI
    create table t8(id int primary key,xuehao int unique not null);
    mysql> desc t8;
    +--------+---------+------+-----+---------+-------+
    | Field | Type | Null | Key | Default | Extra |
    +--------+---------+------+-----+---------+-------+
    | id | int(11) | NO | PRI | NULL | |
    | xuehao | int(11) | NO | UNI | NULL | |
    +--------+---------+------+-----+---------+-------+
    # 一个表里面只能有一个主键
    create table t9(id int primary key,xuehao int primary key);
    # ERROR 1068 (42000): Multiple primary key defined

    (6) auto_increment: 自增加1,一般配合主键使用,或者unique
    create table t10(id int primary key auto_increment,xuehao int default 111);
    insert into t10 values();
    insert into t10 values();
    mysql> select * from t10;
    +----+--------+
    | id | xuehao |
    +----+--------+
    | 1 | 111 |
    | 2 | 111 |
    +----+--------+
    delect:只是删除数据,增加的数据ID号还是从上一个接着增加
    delete from t10;
    insert into t10 values();
    mysql> select * from t10;
    +----+--------+
    | id | xuehao |
    +----+--------+
    | 3 | 111 |
    +----+--------+
    truncate: 是重置表,增加的数据ID从1开始
    truncate t10;
    insert into t10 values();
    mysql> select * from t10;
    +----+--------+
    | id | xuehao |
    +----+--------+
    | 1 | 111 |
    +----+--------+

    # 可设置自增的其实位置
    create table t1(
    id int primary key auto_increment,
    name varchar(255)
    )engine = myisam auto_increment=3 charset=utf8;

    (7) zerofill: 0填充,配合int使用,可设置位数,位数不够的,用0填充
    create table t11(id int(8) zerofill);
    insert into t11 values(222);
    insert into t11 values(123456789);
    mysql> select * from t11;
    +-----------+
    | id |
    +-----------+
    | 00000222 |
    | 123456789 |
    +-----------+
    (1) 联合唯一约束:unique(字段1,字段2,字段3..),把多个字段拼在一起表达唯一的数据,多个字段结合在一起作为主键
    # 都不为空
    create table t14(id int(4) not null,xuehao int(8) not null, unique(id,xuehao));
    insert into t12 values(1,111);
    insert into t12 values(1,222);
    insert into t12 values(1,111); # ERROR 1062 (23000): Duplicate entry '1-111' for key 'id'
    mysql> desc t12;
    +-------+---------+------+-----+---------+-------+
    | Field | Type | Null | Key | Default | Extra |
    +-------+---------+------+-----+---------+-------+
    | id | int(4) | NO | PRI | NULL | |
    | name | char(4) | NO | PRI | NULL | |
    +-------+---------+------+-----+---------+-------+

    # 有字段为空,显示为MUL普通索引
    create table t16(class char(4),id int(4),xuehao int(8), unique(id,xuehao) );
    insert into t16 values(2,1,111);
    insert into t16 values(1,null,111);
    insert into t16 values(1,null,null);
    mysql> select * from t16;
    +-------+------+--------+
    | class | id | xuehao |
    +-------+------+--------+
    | 2 | 1 | 111 |
    | 1 | NULL | 111 |
    | 1 | NULL | NULL |
    | 1 | NULL | NULL |
    +-------+------+--------+
    mysql> desc t16;
    +--------+---------+------+-----+---------+-------+
    | Field | Type | Null | Key | Default | Extra |
    +--------+---------+------+-----+---------+-------+
    | class | char(4) | YES | | NULL | |
    | id | int(4) | YES | MUL | NULL | |
    | xuehao | int(8) | YES | | NULL | |
    +--------+---------+------+-----+---------+-------+

    # 若primary key和联合唯一约束同时出现,以primary key 为主键
    主键不能再增加值,联合唯一约束可以再增加
    create table t17(id int primary key,xuehao int not null,class int not null,unique(xuehao,class));
    mysql> desc t17;
    +--------+---------+------+-----+---------+-------+
    | Field | Type | Null | Key | Default | Extra |
    +--------+---------+------+-----+---------+-------+
    | id | int(11) | NO | PRI | NULL | |
    | xuehao | int(11) | NO | MUL | NULL | |
    | class | int(11) | NO | | NULL | |
    +--------+---------+------+-----+---------+-------+
    (2) foreign key:外键,把多张表通过一个关键字段联合起来,外键要求,关联的字段必须具有唯一性(unique/primary key)
    create table class1(id int unique , classname varchar(255));
    insert into class1 values(1,"py");
    insert into class1 values(2,"li");

    create table students1(
    id int primary key auto_increment,
    name char(5) not null,
    age int,
    classid int,
    foreign key(classid) references class1(id)
    );
    insert into students1 values(123,"bob",18,1);
    insert into students1 values(234,"jack",19,2);
    insert into students1 values(345,"eric",20,1);
    insert into students1 values(456,"rose",21,2);
    delete from class1 where id = 1; # 因有外键关联,所以删除失败
    # ERROR 1451 (23000): Cannot delete or update a parent row:
    # a foreign key constraint fails (`db0617`.`students1`, CONSTRAINT `students1_ibfk_1`
    # FOREIGN KEY (`classid`) REFERENCES `class1` (`id`))

    delete from students1 where classid = 1; # 先删除关联数据
    delete from class1 where id = 1;
    mysql> select * from class1;
    +------+-----------+
    | id | classname |
    +------+-----------+
    | 2 | li |
    +------+-----------+
    1 row in set (0.00 sec)

    mysql> select * from students1;
    +-----+------+------+---------+
    | id | name | age | classid |
    +-----+------+------+---------+
    | 234 | jack | 19 | 2 |
    | 456 | rose | 21 | 2 |
    +-----+------+------+---------+

    联级删除,联级更新(谨慎操作)
    create table class2(id int unique , classname varchar(255));
    insert into class2 values(1,"py");
    insert into class2 values(2,"li");

    create table students2(
    id int primary key auto_increment,
    name char(5) not null,
    age int,
    classid int,
    foreign key(classid) references class2(id) on delete cascade on update cascade
    );
    insert into students2 values(123,"bob",18,1);
    insert into students2 values(234,"jack",19,2);
    insert into students2 values(345,"eric",20,1);
    insert into students2 values(456,"rose",21,2);
    # 联级删除
    delete from students2 where classid = 1;
    # 联级更新
    update class2 set id = 3 where classname = "li";
    mysql> select * from class2;
    +------+-----------+
    | id | classname |
    +------+-----------+
    | 1 | py |
    | 3 | li |
    +------+-----------+
    2 rows in set (0.00 sec)

    mysql> select * from students2;
    +-----+------+------+---------+
    | id | name | age | classid |
    +-----+------+------+---------+
    | 234 | jack | 19 | 3 |
    | 456 | rose | 21 | 3 |
    +-----+------+------+---------+

     关于约束的添加和删除
     (1)  添加/删除 约束 not null
    alter table 表名 modify 字段名 类型
    alter table t1 modify id int not null
    alter table t1 modify id int

    (2) 添加/删除 unique 唯一索引
    alter table 表名 add unique(id)
    alter table t1 add unique(id)
    alter table t1 drop index id

    (3)  添加/删除 primary key
    alter table 表名 add primary key(id);
    alter table t1 add primary key(id);
    alter table t1 drop primary key;

    (4) 添加/删除 foreign key 外键 (先通过desc 表 找到外键名字,然后再删)
    alter table student1 drop foreign key student1_ibfk_1;  #删除
    alter table student1 add foreign key(classid) references class1(id)  #添加

    存储引擎 : 存储数据的结构方式
    show engines; 查看存储引擎

    # 概念理解:
    表级锁 : 如果有人修改了当前这个表,会直接上表锁,其他人无法修改,在编辑数据时候,速度慢,不能高并发(MyISAM)
    行级锁 : 如果有人修改了当前这个表中的一条记录,当前这个数据记录会上锁,其他数据仍然可以正常修改,速度快,允许更高的并发(InnoDB)
    支持事务处理 : 如果执行sql语句,在全部成功之后,在选择提交数据,有一条失败,立刻回滚,恢复成原来状态.
    begin : 开始事务
    commit : 提交数据
    rollback: 回滚数据


    InnoDB : 5.6版本后的默认存储引擎,支持事务处理,行级锁,外键
    MyISAM : 5.6版本前的默认存储引擎,支持表级锁
    MEMORY : 把数据放在内存中,用做缓存
    BLACKHOLE : 黑洞,用来同步主从数据库中的数据.场景发生在服务器并发集群,用在主从数据库当中[主数据库:增删改,从数据库:查询]
    D:MySQL5.7mysql-5.7.25-winx64datadb0617
    create table myisam1(id int,name char(10)) engine = myisam;
    myisam1.frm 表结构
    myisam1.MYD 表数据
    myisam1.MYI 表索引


    create table innodb1(id int,name char(10)) engine = innodb;
    innodb1.frm 表结构
    innodb1.ibd 表数据+表索引

    create table memory1(id int,name char(10)) engine = memory;
    memory1.frm 表结构
    没有表数据文件,因为把数据存放在内存中了.

    create table blackhole1(id int,name char(10)) engine = blackhole;
    blackhole1.frm 表结构
  • 相关阅读:
    导入excel
    aspx页面调用发送邮件验证码(结合前两篇)
    随机生成数字(ashx文件,调用上篇所写发送邮件代码)
    C#邮箱发送验证码
    linq查询一个字段的总和
    随部分div增高总的div也随着增高
    视图显示库存余量
    利用存储过程把两个表的数据插入到一个新表中(存储过程中写两个游标)
    使用kindeditor文本编辑器
    MSSQLServer 2016 安装遇到的问题
  • 原文地址:https://www.cnblogs.com/fdsimin/p/13153793.html
Copyright © 2020-2023  润新知