数据库表的具体操作

数据库表的具体操作

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';

猜你喜欢

转载自www.cnblogs.com/godlover/p/12023955.html
今日推荐