MySQL之表操作二

1>数据类型

    1.1>数值类型

        -->整型:tinyint,smallint,mediumint,int,bigint

        -->小数:float,double,decimal(内部原理是以字符串形式存储)

    各类型保存的整数数据范围如下:

    

    tinyint默认为有符号,即数字前有正负号;若要设置为无符号的,需用unsigned参数

    int默认为有符号,bigint也一样。

        如,create table t2(x tinyint unsigned);

    注意:指定整型类型时,后面均不必指定‘宽度’,如直接写int,而不用写int(4),因为整型的这个宽度与

    其他类型不同,这里为显示宽度,比如这里设置了4,默认设定成4个字符的宽度,当超出就自动加宽,所以,

    这个设定基本没有意义,而且还容易坑人。

    小数型类型的用法如下,

    FLOAT[(M,D)] [UNSIGNED] [ZEROFILL]

    单精度浮点数(非准确小数值),m是数字总个数,d是小数点后个数。m最大值为255,d最大值为30

     随着小数的增多,精度变得不准确

    DOUBLE[(M,D)] [UNSIGNED] [ZEROFILL]

    双精度浮点数(非准确小数值),m是数字总个数,d是小数点后个数。m最大值为255,d最大值为30

    随着小数的增多,精度比float要高,但也会变得不准确

    decimal[(m[,d])] [unsigned] [zerofill]

    准确的小数值,m是数字总个数(负号不算),d是小数点后个数。 m最大值为65,d最大值为30。

    对于精确数值计算时需要用此类型,decaimal能够存储精确值的原因在于其内部按照字符串存储。

    

    1.2>日期类型

        YEAR:格式YYYY,范围(1901-2155),

        DATE:格式YYYY-MM-DD,范围(1000-01-01至9999-12-31),

        TIME:格式HH:MM:SS,范围(-838:59:59 - 838:59:59),

        DATETIME:格式YYYY-MM-DD HH:MM:SS,范围(1000-01-01 00:00:00/9999-12-31 23:59:59)

        TIMESTAMP:格式YYYYMMDD HHMMSS,范围(1970-01-01 00:00:00/2037 年某时)

        

        datetime与timestamp的区别

        -->日期范围不同,datetime范围更大

        -->datetime使用8字节的存储空间,timestamp的存储空间为4字节,所以,timestamp更省空间。

        -->datetime默认值为null,timestamp的默认值not null,默认为当前时间。

        其实实际应用场景中,这两种类型都能满足我们的需求,当然,最常用的还是datetime了。

    1.3>字符串类型

        --->char:定长,存取速度快,浪费空间

        --->varchar:不定长,存取速度慢,节省空间

    

    char存放数据时,若设置位宽为4,数据不够时后面补空格填充,所以浪费空间,因为存的是4的定长,所以取的时候

    直接4个4个这样取就行了,简单粗暴。

    varchar存放数据时,若设置位宽为4,不管数据多少,都要一个bytes为用来存放数据长度信息(不然取的时候不知道

    怎么截取),所以如上图,尽管存入一个空格,也有一个bytes长度,存放的就是数据长度的信息,存的时候要加长度一起

    存,所以速度相对较慢,取的时候同理,要先读取1bytes里面的数据长度,再根据长度去截取数据,所以取的效率也相对

    较慢,当数据小于设置位宽时,确实是更省空间的,

    但是,现今社会,大部分场景下,存取速度都比占磁盘容量更优先考虑,所以,大部分时候我们都用char,肯定也有用

    varchar的时候,但是不管用哪种,记住,不要混着用,一个数据或者一张表要么全用char,或者全用varchar。

    其他:

    char存放数据,不够定长时后面补空格,但是取的时候会默认把后面的空格删掉,记住:它默认补后面,也只会删后面

    的空格,前面或者中间的,则不管。

    可以用  SET sql_mode = 'PAD_CHAR_TO_FULL_LENGTH';   让他‘现出原形’。

    1.4>枚举类型与集合类型

    字段的值只能在给定范围中选择,如单选框,多选框
    enum 单选 只能在给定的范围内选一个值,如性别 sex 男male/女female

    set 多选 在给定的范围内可以选择一个或一个以上的值(爱好1,爱好2,爱好3...)

    

    若选值不在枚举或者集合以内,会报错。

2>完整性约束

    约束条件与数据类型的宽度一样,都是可选参数

    作用:用于保证数据的完整性和一致性

    PRIMARY KEY (PK)    标识该字段为该表的主键,可以唯一的标识记录
    FOREIGN KEY (FK)    标识该字段为该表的外键
    NOT NULL    标识该字段不能为空
    UNIQUE KEY (UK)     标识该字段的值是唯一的
    AUTO_INCREMENT      标识该字段的值自动增长(整数类型,而且为主键)
    DEFAULT    为该字段设置默认值

    UNSIGNED 无符号

    ZEROFILL 使用0填充

    2.1>not null 与 default

    是否可空,null表示可空,非字符串
    not null - 不可空
    默认值,创建列时可以指定默认值,当插入数据时如果未主动设置,则自动添加默认值。
    例子
    

    2.2>unique

    设置唯一约束,单列唯一 或联合唯一(多个列的数据组合到一起为唯一)

    单列唯一设置的2中方法,

    

    联合唯一的设置方法

    

    

    2.3>primary key

    primary key字段的值不为空且唯一

    对于innodb存储引擎来说,一张表内必须有一个主键,这是该引擎特有的一个机制,如果没有设置主键

    则系统会自动找一列数据非空且唯一的列作为主键,若没有该列,则会生成一个隐藏的列作为主键,

    所以,在innodb存储引擎下建表时,我们最好设置一个主键,大部分情况下就设id就好了。

    一个表中可以:
    单列做主键
    多列做主键(复合主键)

    但一个表内只能有一个主键primary key

    

    多列主键示例,约束同联合唯一且非空。

    

    2.4>auto_increment

    约束字段为自动增长,被约束的字段必须同时被key约束

    

    也可以指定id,比如此时默认到3了,我下一条记录指定为5,那么,再下一次自增就基于5开始(也就是

    最后一条记录开始自增),

    其他了解知识:如上,id是从1开始自增(初始值),并且每次增加为1(步长),这个值是可以设置的。

    set global auto_increment_increment=5;    # 设置步长

    set global auto_increment_offset=3;    # 设置初始值

    设置完需重新登录客户端生效,并且初始值不能大于步长。

    看下delete和truncate删除数据的区别;

    

    所以,我们应尽量使用truncate 删除数据。

    2.5>foreign key

     关联表,建立表之间的关系

    建表顺序: 先建立被关联的表,并保证被关联字段唯一。

                    再创建关联的表。

    插入数据顺序:先插入被关联的表,再插入关联的表。

    

    实际当中做表关联用的不是太多,表之间的关联一般是逻辑关联,通过应用实现,并不是这种强耦合式的,

    因为关联起来,很容‘牵一发而动全身’,不易扩展,所以一般都是理清逻辑关系,通过其他途径使表之间

    看起来像存在着关联关系。

猜你喜欢

转载自blog.csdn.net/huangql517/article/details/80237353