zoukankan      html  css  js  c++  java
  • 数据类型与约束条件

    # 数据库命名规则
    # 可以由字母、数字、下划线、@、#、$
    #
    #       区分大小写
    #
    #       唯一性
    #
    #       不能使用关键字如 create select
    #
    #       不能单独使用数字
    #
    #       最长128位

    # mysql 数据类型
    # 对于整型来说,数据类型后面的宽度并不是存储长度限制,而是显示限制
    # int的存储宽度是4个Bytes,即32个bit,即2**32
    # 所以int类型默认的显示宽度为11是非常合理的

    # 设置无符号
    # create table t1(id tinyint unsigned);
    # 1.FLOAT[(M,D)] [UNSIGNED] [ZEROFILL]
    #
    # 定义:
    # 单精度浮点数(非准确小数值),
    # m是整数部分总个数,d是小数点后个数。m最大值为255,d最大值为30,例如:float(255,30)

    # 2.DOUBLE[(M,D)] [UNSIGNED] [ZEROFILL]
    #
    # 定义:
    # 双精度浮点数(非准确小数值),
    # m是整数部分总个数,d是小数点后个数。m最大值也为255,d最大值也为30
    #
    # #
    # 3.decimal[(m[,d])] [unsigned] [zerofill]
    #
    # 定义:
    # 准确的小数值,m是整数部分总个数(负号不算),d是小数点后个数。
    # m最大值为65,d最大值为30。比float和double的整数个数少,但是小数位数都是30位



    # 日期类型
    # 方法now() 是获取当前的时间

    # YEAR
    # YYYY(范围:1901/2155)2018 #无论指定的是什么宽度,默认的都是4

    #
    # DATE
    # YYYY-MM-DD(范围:1000-01-01/9999-12-31)例:2018-01-01
    #
    # TIME
    # HH:MM:SS(范围:'-838:59:59'/'838:59:59')例:12:09:32
    #
    # DATETIME (存储时间与时区无关,存储空间8字节,默认为null )
    #
    # YYYY-MM-DD HH:MM:SS(范围:1000-01-01 00:00:00/9999-12-31 23:59:59 Y)例: 2018-01-01 12:09:32
    #
    # TIMESTAMP(存储时间与时间有关,存储空间4字节,默认为not null ,默认值为当前时间)
    #
    # YYYYMMDD HHMMSS(范围:1970-01-01 00:00:00/2037 年某时)
    # 如果表头设置了这种类型的时间的话,默认是设置了不能为空,并这只了默认值为当前的时间
    # create table t1(x datetime not null default now()); # 需要指定传入空值时默认取当前时间

    # 1.
    # 单独插入时间时,需要以字符串的形式,按照对应的格式插入
    # 2.
    # 插入年份时,尽量使用4位值
    # 3.
    # 插入两位年份时, <= 69,以20开头,比如50, 结果2050
    # >= 70,以19开头,比如71,结果1971
    # mysql > create
    # table
    # t12(y year);
    # mysql > insert into t12 values
    # -> (50),
    # -> (71);
    # mysql > select * from t12;
    #
    # +------+
    # | y |
    # +------+
    # | 2050 |
    # | 1971 |
    # +------+


    # 常见字符串类型
    # #char类型:定长,简单粗暴,浪费空间,存取速度快
    # 字符长度范围:0-255(一个中文是一个字符,是utf8编码的3个字节)
    # 存储:
    # 存储char类型的值时,会往右填充空格来满足长度
    # varchar类型:变长,精准,节省空间,存取速度慢
    # 字符长度范围:0-65535(如果大于21845会提示用其他类型 。
    # mysql行最大限制为65535字节,字符编码为utf
    # 强调:varchar类型会在真实数据前加1-2Bytes的前缀,
    # 该前缀用来表示真实数据的bytes字节数
    # (1-2Bytes最大表示65535个数字,正好符合mysql对row的最大字节限制,即已经足够使用)

    #
    # 枚举类型
    # enum 和set

    # 表的创建
    # # 语法结构
    # create table 表名(
    # 字段名1 类型[(宽度) 约束条件],
    # 字段名2 类型[(宽度) 约束条件],
    # 字段名3 类型[(宽度) 约束条件]
    # );
    # 创建表的约束条件
    # PRIMARY KEY (PK) 可以唯一的标识记录primary key字段的值不为空且唯一,
    # 主键primary key是innodb存储引擎组织数据的依据,
    # innodb称之为索引组织表,一张表中必须有且只有一个主键。
    #在没有设置主键的时候,not null + unique 将自动识别为主键
    # 方法1;对一个字段使用not null 和 unique
    #方法2: 对一个字段使用 primary key
    # 方法3:在所有的字段后面单独定义primary key
    # create table department3(id int,name varchar(20),comment varchar(100),constraint pk_name primary key(id));

    # 联合主键,与联合唯一相似
    # create table service(ip int ,port int,primary key(ip,port));


    # AUTO_INCREMENT 标识该字段的值自动增长(整数类型,而且为主键)
    # 不用指定id 默认为1,步长为1,自动增长
    # create table gg(id int primary key auto_increment,name char(10));

    # insert into gg(name) values('panzhenwei')
    # 也可以手动进行插入,插入一个id之后,再使用自动的,会按照插入后的顺序往下

    # FOREIGN KEY (FK) 标识该字段为该表的外键,
    # 外键使用要注意的几个点;
    # 1.两张表都必须是InnoDB表 (show create table 表名)
    # 2.对应列必须具有相似的内部数据类型。
    # 3.建立外键关系的对应列必须建立了索引(eg: primary key)
    # 简单的说就是创建外键的时候的数据类型要与主键的数据类型保持一致

    #首先设置被关联表,在设置关联表
    # 然后在关联表上指定被通过某一与被关联表上的相同项进行关联
    # create table emp(id int primary key auto_increment,name char(10),dep_id int,foreign key(dep_id) references dep(id));
    #这条指令中本表的的dep_id 的项关联dep表中的id的项


    # 并且在插入数据的时候,先插如被关联表的数据在插入关联表的数据
    # 在删除数据的时候,如果被关联表的某些数据被关联之后,是不能做出删除或更改的操作的,只能在关联的表上进行操作
    #要先将关联数据删除,才能删除被关联的表的数据。

    # 怎么才可以做到,在更改被关联表的时候,同步更改关联表的内容
    # 重建表,我们现在要解决的问题是:
    # 我们要达到一个在做某个表(被关联表)更新或者删除操作的时候,
    # 关联表的数据同步的进行更新和删除的效果,

    #在创建的关联表在创建表,使用外键进行关联的时候在外键的后面添加两条指令
    # on update cascade on delete cascade(级联删除);
    # 两条命令之间的说明
    # update/delete 的作用是在父表上找不到候选键的话,则不允许insert/update

    #这样在可以直接操作在外键中被关联表的数据了,如果修改被关联表的被关联的数据,
    #关联表会更同步更新,如果被关联表直接删除数据,那么关联表的数据也会消失

    # cascade(级联删除或更新)方式 在父表上update/delete记录时,同步update/delete掉子表的匹配记录
    # set null方式 在父表上update/delete记录时,将子表上匹配记录的列设为null
    # -- 要注意子表的外键列不能为not null

    # 详细操作一波(一对多的关系)
    # create table department(id int primary key,name varchar(10) not null);被关联表
    # > create table employee(
    # -> id int primary key,
    # -> name varchar(20) not null,
    # -> dpt_id int,
    # -> constraint fk_name foreign key(dpt_id)
    # -> references department(id)
    # -> on delete cascade
    # -> on update cascade ); 关联表



    # 先往父表插入内容
    # insert into department values(1, '技术中心'), (2, '营销中心'), (3, '财务中心')
    # 在往子表插入内容
    # insert into employee values (1,'panzhenwei',1),(2,'linyin',2),(3,'xuxiaoli',3);

    # 多对一的关系,一张表的某个字段的多项记录(子表)对应另一张表的某个字段的一项记录(父表)
    # 多对多的关系,两张表相互满足多对一 ,可以通过定义一张新表作为这两张表的关系表


    # delete不是用来清空表的,是用来删除一些你想删除的符合某些条件的数据,一般用在delete from tb1 where id>20;
    # 这样的,如果要清空表,让id置零,使用truncate
    # 使用del 清空的 时候,如果使用自动添加的话,id是按照原来的id进行向后添加的


    # NOT NULL 标识该字段不能为空, 默认值,创建列时可以指定默认值,当插入数据时如果未主动设置,则自动添加默认值
    # UNIQUE KEY (UK) 标识该字段的值是唯一的,是一种key,唯一键,是在数据类型之外的附加属性,其实还有加速查询的作用
    # 方法1:
    # create table department(id int,name varchar(20) unique,coment varchar(100));
    # 方法2:
    # create table department2(id int,name varchar(20),comment varchar(100),constraint uk_name unique(name));

    # 联合唯一 与联合主键相似
    # create table service(ip int ,port int,primary key(ip,port));


    # DEFAULT 为该字段设置默认值,#设置id字段有默认值后,则无论id字段是null还是not null,都可以插入空,插入空默认填入default指定的默认值

    #
    # UNSIGNED 无符号
    # ZEROFILL 使用0填充

    # 约束条件分类


    # 常用的引擎的介绍
    # MyISAM引擎
    # 特点:
    # 1.不支持事务
    # 2.表级锁定
    # 3.读写互相阻塞
    # 4.只会缓存索引
    # 5.读取速度较快
    # 6.不支持外键约束,但只是全文索引
    # 小结:单一对数据库的操作都可以示用MyISAM,所谓单一就是尽量纯读,或纯写(insert,update,delete)等。
    #

    # 1.
    # 支持事务:支持4个事务隔离界别,支持多版本读。
    # 2.
    # 行级锁定(更新时一般是锁定当前行):通过索引实现,全表扫描仍然会是表锁,注意间隙锁的影响。
    # 3.
    # 读写阻塞与事务隔离级别相关(有多个级别,这就不介绍啦
    # ~)。
    # 4.
    # 具体非常高效的缓存特性:能缓存索引,也能缓存数据。
    # 5.
    # 整个表和主键与Cluster方式存储,组成一颗平衡树。(了解)
    # 6.
    # 所有SecondaryIndex都会保存主键信息。(了解)
    # 7.
    # 支持分区,表空间,类似oracle数据库。
    # 8.
    # 支持外键约束,不支持全文索引(5.5
    # 之前),以后的都支持了。
    # 9.
    # 和MyISAM引擎比较,InnoDB对硬件资源要求还是比较高的。
    #
    #

    # 事务的四大特性:
    # # 1.
    # # 原子性(Atomicity)
    # # 事务是一个不可分割的单位,事务中的所有SQL等操作要么都发生,要么都不发生。
    # # 2.
    # # 一致性(Consistency)
    # # 事务发生前和发生后,数据的完整性必须保持一致。
    # # 3.
    # # 隔离性(Isolation)
    # # 当并发访问数据库时,一个正在执行的事务在执行完毕前,对于其他的会话是不可见的,多个并发事务之间的数据是相互隔离的。也就是其他人的操作在这个事务的执行过程中是看不到这个事务的执行结果的,也就是他们拿到的是这个事务执行之前的内容,等这个事务执行完才能拿到新的数据。
    # # 4.
    # # 持久性(Durability)
    # # 一个事务一旦被提交,它对数据库中的数据改变就是永久性的。如果出了错误,事务也不允撤销,只能通过
    # # '补偿性事务'。
    #
    # 存储引擎的使用
    #   1、创建表时指定引擎
    #
    # create table innodb_t2(id int)engine=innodb;

    # 1.db.opt文件:用来记录该库的默认字符集编码和字符集排序规则用的。也就是说如果你创建数据库指定默认字符集和排序规则,那么后续创建的表如果没有指定字符集和排序规则,那么该新建的表将采用db.opt文件中指定的属性。
    # 2.后缀名为.frm的文件:这个文件主要是用来描述数据表结构(id,name字段等)和字段长度等信息
    # 3.后缀名为.ibd的文件:这个文件主要储存的是采用独立表储存模式时储存数据库的数据信息和索引信息;
    # 4.后缀名为.MYD(MYData)的文件:从名字可以看出,这个是存储数据库数据信息的文件,主要是存储采用独立表储存模式时存储的数据信息;
    # 5.后缀名为.MYI的文件:这个文件主要储存的是数据库的索引信息;
    # 6.ibdata1文件:主要作用也是储存数据信息和索引信息,这个文件在mysql安装目录的data文件夹下。
    # 从上面可以看出,.ibd储存的是数据信息和索引信息,ibdata1文件也是存储数据信息和索引信息,.MYD和.MYI也是分别储存数据信息和索引信息,那他们之间有什么区别呢?
    # 主要区别是再于数据库的存储引擎不一样,如果储存引擎采用的是MyISAM,则生成的数据文件为表名.frm、表名.MYD、表名的MYI;而储存引擎如果是innoDB,开启了innodb_file_per_table=1,也就是采用独立储存的模式,生成的文件是表名.frm、表名.ibd,如果采用共存储模式的,数据信息和索引信息都存储在ibdata1(在里面进行分类,从外面看是一个文件)中;
    # 在进行数据恢复的时候,如果用的是MYISAM数据引擎,那么数据很好恢复,只要将相应.frm, .MYD, .MYI文件拷贝过去即可。但是如果是innodb的话,则每一个数据表都是一个单独的文件,只将相应的.frm和.ibd文件拷贝过去是不够的,必须在你的ibd文件的tablespace id和ibdata1文件中的元信息的tablespace id一致才可以。
    # msyql人家设定的规则就是这样存储表的,使用人家的系统,就要理解人家的规则。
    #
    # 数据库文件夹中各文件的作用
  • 相关阅读:
    第3天:视图提取请求参数和响应对象
    第2天:Django路由与视图
    第1天:Django框架简介与工程创建
    Jenkins多选项框使用
    备份Kylin的Metadata
    前台传值 后台接受乱码
    查询表的列名,字符类型
    html div隐藏后取消所占的空位
    bootstrap 利用jquery 添加disabled属性
    bootstrap datetimepicker 复选可删除,可规定指定日期不可选
  • 原文地址:https://www.cnblogs.com/vivi0403/p/10099311.html
Copyright © 2011-2022 走看看