标签:datetime 集合 唯一索引 不能 ade 重复 二进制 innodb str
? 包括严格数值数据类型(INTEGER、SMALLINT、DECIMAL和NUMERIC),以及近似数值数据类型(FLOAT、REAL和DOUBLE PRECISION),还有枚举类型enum 和集合类型set 以及布尔值、json
型 | 大小 | 范围(有符号) | 范围(无符号) | 用途 |
---|---|---|---|---|
TINYINT | 1 byte | (-128,127) | (0,255) | 小整数值 |
SMALLINT | 2 bytes | (-32 768,32 767) | (0,65 535) | 大整数值 |
MEDIUMINT | 3 bytes | (-8 388 608,8 388 607) | (0,16 777 215) | 大整数值 |
INT或INTEGER | 4 bytes | (-2 147 483 648,2 147 483 647) | (0,4 294 967 295) | 大整数值 |
BIGINT | 8 bytes | (-9,223,372,036,854,775,808,9 223 372 036 854 775 807) | (0,18 446 744 073 709 551 615) | 极大整数值 |
FLOAT | 4 bytes | (-3.402 823 466 E+38,-1.175 494 351 E-38),0,(1.175 494 351 E-38,3.402 823 466 351 E+38) | 0,(1.175 494 351 E-38,3.402 823 466 E+38) | 单精度 浮点数值 |
DOUBLE | 8 bytes | (-1.797 693 134 862 315 7 E+308,-2.225 073 858 507 201 4 E-308),0,(2.225 073 858 507 201 4 E-308,1.797 693 134 862 315 7 E+308) | 0,(2.225 073 858 507 201 4 E-308,1.797 693 134 862 315 7 E+308) | 双精度 浮点数值 |
DECIMAL | 对DECIMAL(M,D) ,如果M>D,为M+2否则为D+2 | 依赖于M和D的值 | 依赖于M和D的值 | 小数值 |
类型 | 大小 ( bytes) | 范围 | 格式 | 用途 |
---|---|---|---|---|
DATE | 3 | 1000-01-01/9999-12-31 | YYYY-MM-DD | 日期值 |
TIME | 3 | ‘-838:59:59‘/‘838:59:59‘ | HH:MM:SS | 时间值或持续时间 |
YEAR | 1 | 1901/2155 | YYYY | 年份值 |
DATETIME | 8 | 1000-01-01 00:00:00/9999-12-31 23:59:59 | YYYY-MM-DD HH:MM:SS | 混合日期和时间值 |
TIMESTAMP | 4 | 1970-01-01 00:00:00/2038结束时间是第 2147483647 秒,北京时间 2038-1-19 11:14:07,格林尼治时间 2038年1月19日 凌晨 03:14:07 | YYYYMMDD HHMMSS | 混合日期和时间值,时间戳 |
字符串类型
类型 | 大小 | 用途 |
---|---|---|
CHAR | 0-255 bytes | 定长字符串 |
VARCHAR | 0-65535 bytes | 变长字符串 |
TINYBLOB | 0-255 bytes | 不超过 255 个字符的二进制字符串 |
TINYTEXT | 0-255 bytes | 短文本字符串 |
BLOB | 0-65 535 bytes | 二进制形式的长文本数据 |
TEXT | 0-65 535 bytes | 长文本数据 |
MEDIUMBLOB | 0-16 777 215 bytes | 二进制形式的中等长度文本数据 |
MEDIUMTEXT | 0-16 777 215 bytes | 中等长度文本数据 |
LONGBLOB | 0-4 294 967 295 bytes | 二进制形式的极大文本数据 |
LONGTEXT | 0-4 294 967 295 bytes | 极大文本数据 |
bit[(M)]
二进制位(101001),m表示二进制位的长度(1-64),默认m=1
tinyint[(m)] [unsigned] [zerofill]
小整数,数据类型用于保存一些范围的整数数值范围:
有符号:
-128 ~ 127.
无符号:
0 ~ 255
特别的: MySQL中无布尔值,使用tinyint(1)构造。
int[(m)][unsigned][zerofill]
整数,数据类型用于保存一些范围的整数数值范围:
有符号:
-2147483648 ~ 2147483647
无符号:
0 ~ 4294967295
特别的:整数类型中的m仅用于显示,对存储范围无限制。例如: int(5),当插入数据2时,select 时数据显示为: 00002
bigint[(m)][unsigned][zerofill]
大整数,数据类型用于保存一些范围的整数数值范围:
有符号:
-9223372036854775808 ~ 9223372036854775807
无符号:
0 ~ 18446744073709551615
decimal[(m[,d])] [unsigned] [zerofill]
准确的小数值,m是数字总个数(负号不算),d是小数点后个数。 m最大值为65,d最大值为30。
特别的:对于精确数值计算时需要用此类型
decaimal能够存储精确值的原因在于其内部按照字符串存储。
FLOAT[(M,D)] [UNSIGNED] [ZEROFILL]
单精度浮点数(非准确小数值),m是数字总个数,d是小数点后个数。
无符号:
-3.402823466E+38 to -1.175494351E-38,
0
1.175494351E-38 to 3.402823466E+38
有符号:
0
1.175494351E-38 to 3.402823466E+38
**** 数值越大,越不准确 ****
DOUBLE[(M,D)] [UNSIGNED] [ZEROFILL]
双精度浮点数(非准确小数值),m是数字总个数,d是小数点后个数。
无符号:
-1.7976931348623157E+308 to -2.2250738585072014E-308
0
2.2250738585072014E-308 to 1.7976931348623157E+308
有符号:
0
2.2250738585072014E-308 to 1.7976931348623157E+308
**** 数值越大,越不准确 ****
char (m)
char数据类型用于表示固定长度的字符串,可以包含最多达255个字符。其中m代表字符串的长度。
PS: 即使数据小于m长度,也会占用m长度
varchar(m)
varchars数据类型用于变长的字符串,可以包含最多达255个字符。其中m代表该数据类型所允许保存的字符串的最大长度,只要长度小于该最大值的字符串都可以被保存在该数据类型中。
注:虽然varchar使用起来较为灵活,但是从整个系统的性能角度来说,char数据类型的处理速度更快,有时甚至可以超出varchar处理速度的50%。因此,用户在设计数据库时应当综合考虑各方面的因素,以求达到最佳的平衡
text
text数据类型用于保存变长的大字符串,可以组多到65535 (2**16 ? 1)个字符。
mediumtext
A TEXT column with a maximum length of 16,777,215 (2**24 ? 1) characters.
longtext
A TEXT column with a maximum length of 4,294,967,295 or 4GB (2**32 ? 1) characters.
enum
枚举类型,
An ENUM column can have a maximum of 65,535 distinct elements. (The practical limit is less than 3000.)
示例:
CREATE TABLE shirts (
name VARCHAR(40),
size ENUM(‘x-small‘, ‘small‘, ‘medium‘, ‘large‘, ‘x-large‘)
);
INSERT INTO shirts (name, size) VALUES (‘dress shirt‘,‘large‘), (‘t-shirt‘,‘medium‘),(‘polo shirt‘,‘small‘);
set
集合类型
A SET column can have a maximum of 64 distinct members.
示例:
CREATE TABLE myset (col SET(‘a‘, ‘b‘, ‘c‘, ‘d‘));
INSERT INTO myset (col) VALUES (‘a,d‘), (‘d,a‘), (‘a,d,a‘), (‘a,d,d‘), (‘d,a,d‘);
DATE
YYYY-MM-DD(1000-01-01/9999-12-31)
TIME
HH:MM:SS(‘-838:59:59‘/‘838:59:59‘)
YEAR
YYYY(1901/2155)
DATETIME
YYYY-MM-DD HH:MM:SS(1000-01-01 00:00:00/9999-12-31 23:59:59 Y)
TIMESTAMP
YYYYMMDD HHMMSS(1970-01-01 00:00:00/2037 年某时)
create table if not exists(判断是否存在) 表名(
表头1 数据类型 default a ,
表头2 数据类型
) engine=innodb default charset=‘utf-8‘;
CREATE TABLE
子句之后创建的表的名称。表名在数据库中必须是唯一的DEFAULT
值用于指定列的默认值设置字段的属性为 NOT NULL, 在操作数据库时如果输入该字段的数据为NULL ,就会报错
create table if not exists(判断是否存在) 表名(
表头1 数据类型 NOT NULL
表头2 数据类型 default NULL (表示默认为空)
) engine=innodb default charset=‘utf-8‘;
primary key 与auto_increment
-- 设置主键与自增
-- 主键,一种特殊的唯一索引,不允许有空值,如果主键使用单个列,则它的值必须唯一,如果是多列,则其组合必须唯一。
-- 一个表只能有一个主键
create table t1(
id int signed not null auto_increment primary key,
num decimal(10,5),
name char(10)
)engine=innodb default charset=utf8;
create table t1(
id int signed not null auto_increment ,
num decimal(10,5),
name char(10),
primary key(id)
)engine=innodb default charset=utf8;
-- 主键可以由多列组成
CREATE TABLE t5 (
nid int(11) NOT NULL AUTO_INCREMENT,
pid int(11) not NULL,
num int(11),
primary key(nid,pid)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
unique
create table t1(
id int ....,
num int,
xx int,
unique 唯一索引名称 (列名,列名),
)
多为其他表的主键
外键表示一个表中的一个字段被另一个表中的一个字段引用
constraint 命名(fk_..) foreign key 表头(当前表参数) references table2(表头)
ON DELETE/ON UPDATE NO ACTION或restrict(父表删除更新时检查是否有对应外键,有则禁止删除)
cascade (父表删除更新时检查是否有对应外键,有则同步)
set Null (父表删除更新时检查是否有对应外键,有则设为null)
CONSTRAINT
子句允许您为外键约束定义约束名称。如果省略它,MySQL将自动生成一个名称FOREIGN KEY
子句指定子表中引用父表中主键列的列CREATE DATABASE IF NOT EXISTS dbdemo;
USE dbdemo;
CREATE TABLE categories(
cat_id int not null auto_increment primary key, comment ‘comment 表示注释‘
cat_name varchar(255) not null,
cat_description text
) ENGINE=InnoDB;
CREATE TABLE products(
prd_id int not null auto_increment primary key,
prd_name varchar(355) not null,
prd_price decimal,
cat_id int not null,
FOREIGN KEY fk_cat(cat_id)
REFERENCES categories(cat_id)
ON UPDATE CASCADE
ON DELETE RESTRICT
)ENGINE=InnoDB;
案例1普通用法.一对多的情况,如:一个角色多个头衔的情况
user | ||
---|---|---|
uid | name | department |
1 | n1 | 1 |
2 | n2 | 1 |
3 | n3 | 2 |
4 | n4 | 2 |
department | |
---|---|
did | cont |
1 | A部门 |
2 | B 部门 |
user表的department 需要外链至department表的did
一个user对应一个department
案例2:一对一 ,不允许出现重复
user | ||
---|---|---|
uid | name | postcard_id |
1 | n1 | 1 |
2 | n2 | 3 |
3 | n3 | 2 |
4 | n4 | 4 |
postcard | |
---|---|
pid | number |
1 | 3101.... |
2 | 3201.... |
3 | 3301..... |
4 | 3401...... |
create table postcard(
pid int auto_increment primary key,
number tinyint,
)engine=innodb default charset=utf8;
create table user(
uid int not null auto_increment primary key,
username varchar(64) not null,
postcard_id int not null,
unique key uq_u1 (postcard_id), commit ‘这里对postcard_id限定唯一不重复‘
CONSTRAINT fk_user_pc FOREIGN key (postcard_id) REFERENCES postcard(pid)
)engine=innodb default charset=utf8;
补充一对不足一:
ser | 少部分权限 | ||
---|---|---|---|
uid | name | password | access |
1 | n1 | 1224 | access2 |
2 | n2 | dasda | access1 |
3 | n3 | 544554 | |
4 | n4 | dasdasd |
针对这种情况
可以单独将用户与权限单独建表, 用以节省空间
ser | 少部分权限 | |
---|---|---|
uid | name | access |
1 | n1 | access2 |
2 | n2 | access1 |
案例3:多对多, 联合唯一的场景
c表内的表头A与表头B,分别为A表,B 表的主键,且表头A与B的数据count>1
由于表头A与表头B存在的这种对应关系,仅能出现一次,故需要两则联合唯一
若业务需求不做约束要求,则不需要使用联合唯一
A | ||
---|---|---|
aid | username | gender |
1 | 张三 | man |
2 | 李四 | woman |
3 | 王五 | man |
B | |
---|---|
bid | store |
1 | store_a |
2 | store_b |
3 | store_c |
c | 人与商店的对应关系 | |
---|---|---|
cid | username | store |
1 | 1 | 1 |
2 | 1 | 2 |
3 | 1 | 3 |
4 | 2 | 2 |
5 | 2 | 1 |
6 | 3 | 1 |
create table if not exist table_A(
aid int auto_increment,
username varchar(10),
primary key(id)
)engine = innodb default charset=utf8;
create table if not exist table_B(
bid int not null auto_increment,
store varchar(30)
primary key(bid)
)engine = innodbb default charset=utf8;
create table if not exist table_c(
cid int not null auto_increment,
username int not null,
store int not null ,
primary key(cid),
unique key uq_username_store(username,store), commit ‘不允许二者一一对应关系再次出现需要使用联合唯一‘
constraint fk_username_a foreign key(username) references to table_a(username),
constraint fk_username_b foreign key(store) references to table_b(store),
)engine = innodbb default charset=utf8;
标签:datetime 集合 唯一索引 不能 ade 重复 二进制 innodb str
原文地址:https://www.cnblogs.com/yescarf/p/14089095.html