引擎,创建完整表,数据库模式,数据库类型,约束条件

引擎(****)

前提:引擎是提供给表使用的,不是数据库
mysql> show engines;#展示所有的引擎
#重点:
#innodb(默认):支持事务,行级锁,外键
#myisam:查询效率优于innodb,当不需要支持事物,行级锁,外键,可以通过设置myisam来优化数据库
mysql> use db1;

mysql> create table t1(id int)engine=innodb;
mysql> create table t2(id int)engine=myisam;
mysql> create table t3(id int)engine=blackhole;
mysql> 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);

select * from t1; #有数据
select * from t2; #有数据
select * from t3; #没有数据
select * from t4; #有数据存放在内存中,重启服务器,数据就会丢失.

创建表完整语法

‘‘‘
create table 表名(
字段名1 类型[(宽度) 约束条件],
字段名2 类型[(宽度) 约束条件],
字段名3 类型[(宽度) 约束条件],
)engine=innodb charset=utf-8;
‘‘‘
#[]可选参数
#create table db1.t1(name char(3) not null);
#数据插入时,name不能为空(null),且最长只能存放三个字符
#insert into t1 values("henry");
#select * from t1; #结果:hen

#insert into t1 values(null);
#ERROR 1048 (23000): Column ‘name‘ cannot be null
#总结:宽度和约束条件为可选参数,用来限制存放数据的规则

数据库的模式(**)

#sql_mode:反应数据库的全局变量
#两种模式
no_engine_substitution:非安全性,默认
strict_trans_tables:安全模式
#数据库模式限制的是客户端对服务器操作数据的方式(是否严格)

#查看当前数据库模式:  variables英语变量的意思
show variables like "%sql_mode%"; #%匹配0-n个任意字符 =>模糊查询

#设置为安全模式
set global sql_mode="strict_trans_tables";

#重新连接(客户端)
quit;
show variables like "%sql_mode%";
#结果:显示已经改为安全模式

#应用
create table t1(name char(2));
insert into t1 values("aa"); #结果:正常
insert into t1 values("aaa");#结果:错误 Data too long for column ‘name‘ at row 1

数据库类型(*****)

#mysql 数据库支持存放那些数据类型
#整型* | 浮点型 | 字符型* | 时间类型 | 枚举类型 | 集合类型 

整型

‘‘‘类型
tinyint:1字节 -128~127 *  -2^8 ~ 2^7-1
smallint:2字节
mediumint:3字节
int:4字节 -2147483648~2147483647 * -2^31 ~ -2^31-1
bigint:8字节
‘‘‘

‘‘‘约束 *
unsigned:无符号
zerofill:0填充
‘‘‘
create table t5(x tinyint);
insert into t5 values(200);#安全模式下 Out of range value for column ‘x‘ at row 1
                           #非安全模式下 值只能到最大值127
select (x) from t5;

‘‘‘宽度
1.不能决定整型存放数据的宽度, 超过宽度可以存放, 最终由数据类型所占字节决定
2.如果没有超过宽度,且有zerofill限制, 会用0填充前置位的不足位
3.没有必要规定整型的宽度, 默认设置的宽度就为该整型能存放数据的最大宽度 *
‘‘‘
# eg:1
create table t6(x int(5));
insert into t6 values(123456);
select (x) from t6; # 结果: 123456
insert into t6 values(2147483648);
select (x) from t6; # 结果: 2147483647
insert into t6 values(10);
select (x) from t6; # 结果: 10
# eg:2
create table t7(x int(5) unsigned zerofill); # 区域0~4294967295 #2^32-1
insert into t7 values(10);
select (x) from t7; # 结果: 00010
insert into t7 values(12345678900);
select (x) from t7; # 结果: 4294967295

浮点型

‘‘‘类型
float:4字节,3.4E–38~3.4E+38 *
double:8字节,1.7E–308~1.7E+308
decimal:M,D大值基础上+2
‘‘‘

‘‘‘宽度:
限制存储宽度
(M, D) => M为位数,D为小数位
float(255, 30):精度最低,最常用
double(255, 30):精度高,占位多
decimal(65, 30):字符串存,全精度
‘‘‘	

#eg:1
create table t8(age float(256,30)); # Display width out of range for column ‘age‘ (max = 255)
create table t8(age float(255,31)); #Too big scale 31 specified for column ‘age‘. Maximum is 30.

#eg:2
create table t8(x float(255,30));
create table t9(x double(255,30));
create table t10(x decimal(65,30));

insert into t8 values(1.11111111111111111111);
insert into t9 values(1.11111111111111111111);
insert into t10 values(1.11111111111111111111);

select * from t8; #1.111111164093017600000000000000 =>小数据,精度要求不高,均采用float来储存*
select * from t9; # 1.111111111111111200000000000000
select * from t10;# 1.111111111111111111110000000000

alter table t10 modify x decimal(10, 5); # 1.11111 => 限制了数据的存储宽度

字符串

‘‘‘类型
char:定长
varchar:不定长
‘‘‘

‘‘‘宽度
限制存储宽度
char(4):以4个字符存储定长存储数据
varchar(4):数据长度决定存储长度,为可变长度存储
‘‘‘

#eg:
create table t11 (x char(4), y varchar(4));
insert into t11 values ("wade","bosh"); #单引号,双引号均可以表示字符
select x,y from t11; #正常
insert into t11 values ("henry","wendy");#非安全模式下数据丢失但可以存放.安全模式下报错
select x,y from t11; #非安全模式下,正常显示丢失后不完整的数据
insert into t11 values ("a","b");

# 验证数据所在字符长度
# 前提: 安全模式下以空白填充字符
set global sql_mode="strict_trans_tables,PAD_CHAR_TO_FULL_LENGTH";
# 重启连接
select char_length(x), char_length(y) from t11; # a占4 b占1

‘‘‘重点: 存储数据的方式 **  => 数据库优化
char: 一定按规定的宽度存放数据, 以规定宽度读取数据, 通常更占空间
varchar: 首先根据数据长度计算所需宽度, 并在数据开始以数据头方式将宽度信息保存起来, 是一个计算耗时过程, 取先读取宽度信息,以宽度信息为依准读取数据, 通常节省空间
‘‘‘
8: zero    egon    lxx     yanghuhu
8: 4zero4egon3lxx8yanghuhu
注: varchar的数据头占1~2字节
    规定char|varchar宽度均为4,用来存放4个字符的数据, char存取更高效,char占4字符,varchar占5字符,char更省空间

总结: 数据长度相近的数据提倡用char来存放数据, 数据需要高速存取,以空间换时间, 采用char

时间类型

‘‘‘类型
year:yyyy(1901/2155)
date:yyyy-MM-dd(1000-01-01/9999-12-31)
time:HH:mm:ss
datetime:yyyy-MM-dd HH:mm:ss(1000-01-01 00:00:00/9999-12-31 23:59:59)
timestamp:yyyy-MM-dd HH:mm:ss(1970-01-01 00:00:00/2038-01-19 指本初子午线时间,北京时间+8h)
‘‘‘

# eg: 1
create table t12(my_year year, my_date date, my_time time);
insert into t12 values(); # 三个时间类型的默认值均是null
insert into t12 values(2156, null, null); # 在时间范围外,不允许插入该数据
insert into t12 values(1, ‘2000-01-01 12:00:00‘, null); # 2001 2000-01-01 null
#给了1 自己做了处理,data的值丢失了一部分,只留下前一部分

insert into t12 values(2019, ‘2019-01-08‘, "15-19-30"); # time报格式错误 => 按照时间规定格式存放数据

alter table t12 change my_year myYear year(2); # 时间的宽度修改后还是采用默认宽度year(4) => 不需要关系宽度

# eg:2
create table t13(my_datetime datetime, my_timestamp timestamp);
insert into t13 values();#不设值,datatime默认值为null,timestamp默认值为current_timestamp
insert into t13 values(null, null); # datatime可以为空, timestamp不能为null,赋值null采用默认值current_timestamp
insert into t13 values(‘4000-01-01 12:00:00‘, ‘2000-01-01 12:00:00‘); # 在各自范围内可以插入对应格式的时间数据

# datetime VS timestamp
datetime:时间范围,不依赖当前时区,8字节,可以为null
timestamp:时间范围,依赖当前时区,4字节,有默认值CURRENT_TIMESTAMP

枚举与集合

‘‘‘类型
enum:单选
set:多选
‘‘‘

create table t14(
    sex enum(‘male‘,‘female‘,‘o‘) not null default ‘o‘, # 枚举 不能为空,默认值"o"
    hobbies set(‘play‘,‘read‘,‘music‘) # 集合
);

insert into t14 values (null, null); # 报错 sex不能设置null
insert into t14 values (); # o null
insert into t14 (hobbies) values (‘play,read‘), (‘music,play‘); # sex采用默认值, 对hobbies字段添加两条记录
insert into t14 (sex,hobbies) values (‘male,female‘, ‘play‘); # 报错 sex字段只能单选

约束条件(*****)

"""
primary key:主键,唯一标识,表都会拥有,不设置为默认找第一个 不为空,唯一 字段,未标识则创建隐藏字段
forein key:外键
unique key:唯一性数据, 该条字段的值需要保证唯一,不能重复

auto_increment:自增,只能加给key字段辅助修饰 一定要与上面三个key中的一个相结合

not null:不为空
default:默认值

unsigned:无符号
zerofill:0填充
"""

注:
1.键是用来讲的io提供存取效率
2.联合唯一
create table web (
    ip char(16),
    port int,
    unique(ip,port)
);
3.联合主键
create table web (
    ip char(16),
    port int,
    primary key(ip,port)
);

# eg:1
# 单列唯一
create table t15 (id int unique);
mysql> desc t15;
+-------+---------+------+-----+---------+-------+
| Field | Type    | Null | Key | Default | Extra |
+-------+---------+------+-----+---------+-------+
| id    | int(11) | YES  | UNI | NULL    |       |
+-------+---------+------+-----+---------+-------+

insert into t15 values(1),(1); #报错:Duplicate entry ‘1‘ for key ‘id‘

alter table t15 modify id int unique not null;
mysql> desc t15;
+-------+---------+------+-----+---------+-------+
| Field | Type    | Null | Key | Default | Extra |
+-------+---------+------+-----+---------+-------+
| id    | int(11) | NO   | PRI | NULL    |       |
+-------+---------+------+-----+---------+-------+

alter table t15 modify id int unique not null auto_increment;
mysql> desc t15;
+-------+---------+------+-----+---------+----------------+
| Field | Type    | Null | Key | Default | Extra          |
+-------+---------+------+-----+---------+----------------+
| id    | int(11) | NO   | PRI | NULL    | auto_increment |
+-------+---------+------+-----+---------+----------------+

# 联合唯一
create table web (
    ip char(16),
    port int,
    unique(ip,port)
);
# 如果联合两个字段,两个字段全相同才相同,否则为不同
insert into web values (‘10.10.10.10‘, 3306), (‘10.10.10.10‘, 3306);
#报错:Duplicate entry ‘10.10.10.10 -3306‘ for key ‘ip‘

# 注:
# 1.表默认都有主键, 且只能拥有一个主键字段(单列主键 | 联合主键)
# 2.没有设置主键的表, 数据库系统会自上而下将第一个规定为unique not null字段自动提升为primary key主键
# 3.如果整个表都没有unique not null字段且没有primary key字段, 系统会默认创建一个隐藏字段作为主键
# 4.通常必须手动指定表的主键, 一般用id字段, 且id字段一般类型为int, 因为int类型可以auto_increment

# eg:2
create table t16(id int auto_increment); # 报错: Incorrect table definition; there can be only one auto column and it must be defined as a key 自增约束必须添加给key的字段

# eg:3
create table t16(id int primary key auto_increment);
insert into t16 values();
insert into t16 values();
insert into t16 values();
mysql> select * from t16;
+----+
| id |
+----+
|  1 |
|  2 |
|  3 |
+----+
delete from t16 where id>0;
insert into t16 values();
mysql> select * from t16;
+----+
| id |
+----+
|  4 |
+----+
# 自增要结合key,不赋值插入,数据会自动自增, 且自增的结果一直被记录保留

# eg:4
# 联合主键
create table t17(
	ip char(16),
    port int,
    primary key(ip,port)
);
# 如果联合两个字段,两个字段全相同才相同,否则为不同
insert into t17 values (‘10.10.10.10‘, 3306), (‘10.10.10.10‘, 3306);

#主键与唯一的区别:主键在唯一的基础上不为空,并且主键内部还含有索引的机构.

  

原文地址:https://www.cnblogs.com/lizeqian1994/p/10265153.html

时间: 2024-07-31 15:20:35

引擎,创建完整表,数据库模式,数据库类型,约束条件的相关文章

【3.3】mysql中的Federated存储引擎,远程表,相当于sql server的linked server

MySQL中针对不同的功能需求提供了不同的存储引擎.所谓的存储引擎也就是MySQL下特定接口的具体实现. FEDERATED是其中一个专门针对远程数据库的实现.一般情况下在本地数据库中建表会在数据库目录中生成相应的表定义文件,并同时生成相应的数据文件. 但通过FEDERATED引擎创建的表只是在本地有表定义文件,数据文件则存在于远程数据库中(这一点很重要). 通过这个引擎可以实现类似Oracle 下DBLINK的远程数据访问功能. 1.使用show engines 命令查看数据库是否已支持FED

MySQL在创建相同表结构时as和like 使用的区别

1.MySQL的复制相同表结构方法: 1)create table table_name as select * from table1 where 1=2 (或者limit  0): 2) create table table_name like table1_name; 二者的用途: as :用来创建相同表结构并复制源表数据.(可根据后面的条件来控制要不要复制源表数据) like:用来创建完整表结构和全部索引. 二者的区别: as :创建出来的table_name缺少table1的索引信息,

数据引擎 创建表完整语法,字段类型,约束条件

数据引擎 创建表完整语法,字段类型,约束条件 回顾: 1.设置密码与修改密码 mysqladmin -uroot -p password设置的密码 mysqladmin -uroot -p原密码 password新密码 2.破解密码 - 1.先关掉服务,杀死进程 - 2.跳过权限认证启动服务端 - 3.以游客的身份登录即可 3.制作服务 - 1.mysql --install - 2.net start mysql 4.语法: 库的操作: 增: create database 库名; creat

MySQL-存储引擎-创建表-字段数据类型-严格模式-字段约束-键-02

目录 扩展点 查看服务端字符.IP.端口配置 取消本次错误输入 例外情况 database 数据库操作 table 数据表操作 查看MySQL存储引擎 常见几个存储引擎 InnoDB MyISAM MEMORY BLACKHOLE 引擎对应的本地化文件 案例 基本操作 创建表的完整语法 表记录基础操作 严格模式补充 查看数据库配置中变量名包含mode的配置参数 模糊匹配 基本数据类型 数据范围 整型 TINYINT SMALLINT MEDIUMINT INT BIGINT 应用场景 结合字段验

关于mysql数据库引擎MyIsam的表锁理解

MySQL中的锁概念 MySQL中不同的存储引擎支持不同的锁机制.比如MyISAM和MEMORY存储引擎采用的表级锁,BDB采用的是页面锁,也支持表级锁,InnoDB存储引擎既支持行级锁,也支持表级锁,默认情况下采用行级锁. Mysql3中锁特性如下: 表级锁:开销小,加锁块:不会出现死锁,锁定粒度大,发生锁冲突的概率最高,并发度最低. 行级锁:开销大,加锁慢:会出现死锁:锁定粒度最小,发生锁冲突的概率最低,并发性也最高. 页面锁:开销和加锁界于表锁和行锁之间,会出现死锁:锁定粒度界与表锁和行锁

Oracle 10g通过创建物化视图实现不同数据库间表级别的数据同步

摘自:http://blog.csdn.net/javaee_sunny/article/details/53439980 目录(?)[-] Oracle 10g 物化视图语法如下 实例演示 主要步骤 在A节点创建原表和物化视图日志 在B节点创建连接A节点的远程链接 在B节点处创建目标表和与目标表名称相同的物化视图 在B节点处刷新物化视图 升级采用存储过程定时任务JOB方式定时刷新物化视图 进一步优化 文章更新记录 参考文章 Oracle 10g 物化视图语法如下: create materia

PostgreSQL表空间、数据库、模式、表、用户/角色之间的关系

看PostgreSQL9的官方文档,我越看越迷糊,这表空间,数据库,模式,表,用户,角色之间的关系怎么在PostgreSQL里这么混乱呢?经过中午的一个小实验,我逐渐理清了个中来龙去脉.下面我来还原我的试验,并循序讲清其中关系. 首先,实验出角色与用户的关系    在PostgreSQL中,存在两个容易混淆的概念:角色/用户.之所以说这两个概念容易混淆,是因为对于PostgreSQL来说,这是完全相同的两个对象.唯一的区别是在创建的时候: 1.我用下面的psql创建了角色kanon:   CRE

创建表,创建数据库, 删除表 ,删除数据库

创建表,创建数据库, 删除表 ,删除数据库 创建数据库 Create  database  text2  创建数据库text2 2. 删除数据库 Drop  database   text2  删除数据库text2 创建表 Create  table class   创建一个表叫class                  这是个主表 ( Code  varchar(20)  primary key,                                     创建序号 Name  

03创建数据库和表以及测试数据库的操作(单元测试框架)

整体项目的框架如下: 省市县需要三张表:省,市,县: 建表的语言为: 注意有空格. 先在model包下新建省市县的实体类: 省: package com.dy.ustc.weatherpro.model; public class Province { private int id; private String provinceName; private String provinceCode; public int getId() { return id; } public void set