数据库-----数据类型、完整性约束

一、数据类型

  1、数字:

    整型:tinyint :有符号范围在(-128,127) 无符号范围在(0,255)使用unsigned    

       int :int类型后面的存储显示宽度,而不是存储宽度,位数不够用zerofill来用0填充 

          bigint :

    小数:

      float:在位数比较短的情况下不精准,

      float(m,d)    m是全长,d是小数点后个数。m最大值为255,d最大值为30

      double:在位数比较长的情况下不精准

      double(m,d)    m是全长,d是小数点后个数。m最大值为255,d最大值为30

      decimal:(如果是用小数,则用推荐使用decimal)

        精准

        内部原理是以字符串形式去存

      decimal[(m[,d])]   [unsigned]   [zerofill]  m是整数部分总个数(负号不算)d是小数点后个数。m最大值为65,d最大为30。

  2、字符串:

    char(10):简单粗暴,浪费空间,存取速度快

    # char类型:定长,简单粗暴,浪费空间,存取速度快

      字符串范围:0-255(一个中文是一个字符,是utf8编码的3个字节)

      存储char类型的值时,会往右填充空格来满足长度

      检索:

        当我们打开pad_char_to_full_length SQL模式(设置SQL模式:SET sql_mode="PAD_CHAR_TO_FULL_LENGTH"; 查询sql的默认模式:select @@sql_mode;)查出的结果就不会自动删除尾部的空格。

    varchar:精确,节省空间,存取速度慢

    # varchar类型:变长,字符长度范围:0-65535    varchar类型存储数据的真实内容,不会用空格填充,就算是空格也会被存起来

    length() :查看字节数

    char_length() :查看字符数

  3、时间类型:

    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 年某时)

    # 调用mysql自带的now()函数,获取当前类型指定的时间 如下结构:

    insert into t1 values(now(),now(),now());

  4、枚举类型与集合类型

    enum   和  set

    enum('vip1','vip2','vip3','vip4'),# 在指定范围内,多选一

    set('play','music','read','study') # 在指定范围内,多选多

二、完整性约束

  1、not null   和  default

    not null  标识该字段不能为空

    default 为该字段设置默认值(默认值可以为空)   

create table tb1(
    nid int not null default 2,
    num int not null
);

  2、unique

    中文翻译:不同的,在mysql中称为单列唯一  

# 第一种创建unique
create table department(
    id int,
    name char(10) unique
);

create table department(
    id int unique,
    name char(10) unique
);

# 第二种创建unique的方式
create table department(
    id int,
    name char(10),
    unique(id),
    unique(name)
);

  3、联合唯一

# 联合唯一 只要两列记录 有一列不同 既符合联合唯一的约束
create table services(
    id int,
    ip char(15),
    port int,
    unique(id),
    unique(ip,port)
);

三、primary key

  一个表中可以:

  单列做主键

  多列做主键(复合主键)

  约束:等价于not null unique,字段的值不为空且唯一。

  存储引擎默认是(innodb):对于innodb存储引擎来说,一张表必须有一主键。

  1、单列主键

# 创建t1表,为id字段设置主键,唯一的不同的记录
create table t1(
    id int primary key,
    name char(16)
);

insert into t1 values(1,"王")(2,"建");
insert into t1 value(2,"山");   # 会报错,因为id是唯一,已经存在id=2了


# not null + unique的化学反应,相当于给id设置primary key
create table t2(
    id int not null unique,  # 相当于primary key
    name char(16)
);
单列主键的使用

  2、复合主键

# 只要id,port其中有一不相同就可以插入
create table t3(
    ip char(15),
    port int,
    primary key(ip,port)
);

四、auto_increment

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

# auto_increment之前必须加primary key,确保id是唯一且不同
create table student(
    id int primary key auto_increment, # 这里往进插的时候也可以指定id
    name varchar(20),
    sex enum('male','female') default 'male',
    hobby set('','','')
);
# 对于自增的字段,在用delete删除后,再插入值,该字段仍按照删除前的位置继续增长,
例如:delete from student where id=2,
# 应该用truncate清空表,比起delete一条一条的删除记录,truncate是直接清空表,在删除大表时用它

五、foreign key

  创建两张关联表操作:

# 创建表时先创建被关联表,再创建关联表
# 先创建被关联表
create table dep(
    id int primary key,
    name varchar(20) not null,
    descripe varchar(20) not null
);

# 再创建关联表(emp表)
create table emp(
    id int primary key,
    name varchar(20) not null,
    age int not null,
    dep_id int,
    constraint fk_dep foreign key(dep_id) references dep(id)
);
# 插入记录时,先往被关联表中插入记录,再往关联表中插入记录
# 如果我们想删除某个部门,并且这个部门的员工表的有关联的记录相继删除,我们需要做一下事情:
constraint fk_dep foreign key(dep_id) references dep(id)
on delete cascade # 同步删除
on update cascade # 同步更新
# 这是一句话,(不要用逗号隔开)

 

posted on 2018-09-18 21:58  窮山霧繞(静妙)  阅读(346)  评论(0编辑  收藏  举报

导航