mysql表级别操作
mysql表级别操作
数据基本操作(增删改查)
增加表
- create table 表名(字段名 数据类型(长度) 约束) ;
- create table t1(id int ,name char(18) not null);
- 在同一张表中字段名不能重复,字段名和数据类型是必须的,长度和约束可选
- create table 表名(字段名 数据类型(长度) 约束) engine=innodb;
- 在建表时设置表的存储引擎为innodb
删除表
- drop table 表名;
- drop table t2;
修改表
- alter table 表名 rename 另一个表名;
- 重命名表
- alter table 表名 **add **字段名 类型(长度) 约束 first/after 字段名;
- 增加表中字段,并把增加字段放在first表的最前面或者after某个字段的后面
- first/after 字段名可选
- alter table 表名 drop 字段名;
- 删除表中字段
- alter table 表名 modify 字段名 数据类型(长度) 约束 first/after 字段名;
- 修改表中某一字段,并把修改后的字段放在first表的最前面或者after某个字段的后面
- first/after 字段名可选
- alter table 表名 change 旧字段名 新字段名 数据类型(长度) 约束 first/after 字段名;
- 修改表中某一字段以及字段名,并把修改后的字段放在first表的最前面或者after某个字段的后面
查看表
查看库下的表
- show tables;
- 查看库下的所有表
查看表结构
- desc 表名;
- 排版清晰简单
- 可以查看字段名、数据类型、长度和部分约束,但不能看到表的存储结构以及编码方式
- show create table 表名;
- 排版比较粗糙,不易观察
- 但可以查看字段名、数据类型、长度、部分约束、表的存储结构以及编码方式
#第一种方式
mysql>desc t1;
+--------+-----------------------+------+-----+---------+----------------+
| Field | Type | Null | Key | Default | Extra |
+--------+-----------------------+------+-----+---------+----------------+
| id | int(11) | NO | PRI | NULL | auto_increment |
| name | char(18) | NO | | NULL | |
| gender | enum('man','felmale') | YES | | NULL | |
+--------+-----------------------+------+-----+---------+----------------+
3 rows in set (0.02 sec)
#第二种方法
mysql>show create table t1;
+-------+-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| Table | Create Table |
+-------+-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| t1 | CREATE TABLE `t1` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`name` char(18) NOT NULL,
`gender` enum('man','felmale') DEFAULT NULL,
PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=7 DEFAULT CHARSET=utf8 |
+-------+-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
1 row in set (0.01 sec)
存储引擎
- 存储引擎也就是存储数据的方法
- 将数据存储在硬盘中的存储引擎
- innodb
- mysql5.5.8版本后的默认存储引擎
- 存储数据时会使用两张表
- 一张表存储数据和索引,后缀名为.ibd
- 一张表用于存储表结构,后缀名为.frm
- 支持事务
- 确保数据的完整性,保证数据的安全
- 支持行级锁
- 当对少数行进行操作或对一行数据频繁操作的时候使用行级锁
- 支持表级锁
- 当对表中数据进行批量操作时,为了确保数据准确性时使用
- 支持外键
- 使用外键关联的两张表的字段不能随意添加/删除/修改
- 能够大大降低数据增删改的出错率
- myisam
- mysql5.5.8版本之前的默认存储引擎
- 储存数据时会在data文件夹下使用三张表
- 一张表用于存储数据.后缀名为.MYD
- 一张表用于存储索引.后缀名为.MYI
- 一张表用于存储表结构后缀名为.frm
- 支持表级锁
- 储存数据时会在data文件夹下使用三张表
- mysql5.5.8版本之前的默认存储引擎
- innodb
- 将数据存储在内存中的存储引擎
- memory
- 将数据存放在内存中,如果数据库重启或发生崩塌,表中数据将全部消失
- 非常适合存储临时数据的临时表,默认为哈希索引
- 存储数据时只会使用一张表
- 用于存储表结构,后缀名为.frm
- 只支持表级锁,并发性较差
- memory
数据类型
- 数字类型
- int
- 默认为11个字长
- float(m,n)
- m为浮点数的总长度,n为小数点后的长度,所以注意小数点前的长度为m-n
- int
类型 | 大小 | 范围(有符号) | 范围(无符号)unsigned约束 | 用途 |
---|---|---|---|---|
tiny int | 1 字节 | (-128,127) | (0,255) | 小整数值 |
small int | 2 字节 | (-32 768,32 767) | (0,65 535) | 大整数值 |
medium int | 3 字节 | (-8 388 608,8 388 607) | (0,16 777 215) | 大整数值 |
int或integer | 4 字节 | (-2 147 483 648,2 147 483 647) | (0,4 294 967 295) | 大整数值 |
big int | 8 字节 | (-9 233 372 036 854 775 808,9 223 372 036 854 775 807) | (0,18 446 744 073 709 551 615) | 极大整数值 |
float | 4 字节 float(255,30) | (-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 字节 double(255,30) | (-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 double(65,30) | 依赖于M和D的值 | 依赖于M和D的值 | 小数值 |
- 时间类型
- date
- 使用now()函数输出为年-月-日
- 比较常用,如生日,入职日期等
- time
- 使用now()函数输出为时-分-秒
- 比较常用,如跑步运动员记时等
- datetime
- 使用now()函数输出为年-月-日 时-分-秒
- 比较常用,如下班打卡等
- year
- 使用now()函数输出为年
- 使用不太多
- timestamp
- 不太常用,因为它最长的时间也只到2038-1-19 11:14:07
- 使用now()函数输出为年-月-日 时-分-秒
- date
类型 | 大小 (字节) | 范围 | 格式 | 用途 |
---|---|---|---|---|
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和varchar
- char
- 定长字符串,不写长度时默认为1个字符
- 特点:效率高,但浪费空间
- varchar
- 变长字符串,必须要写长度
- 特点:效率低,但节省空间
- char
类型 | 大小 | 用途 |
---|---|---|
char | 0-255字节 | 定长字符串 |
varchar | 0-65535 字节 | 变长字符串 |
tiny blob | 0-255字节 | 不超过 255 个字符的二进制字符串 |
tiny text | 0-255字节 | 短文本字符串 |
blob | 0-65 535字节 | 二进制形式的长文本数据 |
text | 0-65 535字节 | 长文本数据 |
medium blob | 0-16 777 215字节 | 二进制形式的中等长度文本数据 |
medium text | 0-16 777 215字节 | 中等长度文本数据 |
long blob | 0-4 294 967 295字节 | 二进制形式的极大文本数据 |
long text | 0-4 294 967 295字节 | 极大文本数据 |
- enum/set
- enum(单选)
- sex enum('man','women')
- 写入值时只能二选一,不能选择其他的值
- sex enum('man','women')
- set(多选)
- hobby set('抽烟','喝酒','烫头')
- 写入值时只能从这几个爱好中选择,重复选mysql会自动去重,写了其他的非设置里的值mysql不会将其写入数据库中
- hobby set('抽烟','喝酒','烫头')
- enum(单选)
类型 | 大小 | 用途 |
---|---|---|
enum | 对1-255个成员的枚举需要1个字节存储; 对于255-65535个成员,需要2个字节存储; 最多允许65535个成员。 | 单选:选择性别 |
set | 1-8个成员的集合,占1个字节; 9-16个成员的集合,占2个字节 ; 17-24个成员的集合,占3个字节; 25-32个成员的集合,占4个字节; 33-64个成员的集合,占8个字节 | 多选:兴趣爱好 |
约束
-
无符号:unsigned
- 主要放在数字类型数据后面
-
非空:not null
- 当设置了not null但依旧可以插入空值怎么办,解决方法如下:
# 1.直接在mysql中添加(重启后失效) mysql>set sql_mode='strict_trans_tables,no_auto_create_user,no_engine_substi tution; # 2.直接在配置文件my.ini中添加(永久有效) sql_mode='strict_trans_tables,no_auto_create_user,no_engine_substitution;
-
默认值:default
- default 值
-
唯一:unique
- 联合唯一
- 先写完字段名、类型及约束再写unique()
- unique(字段名1,字段名2,……)
- 联合唯一
-
主键:primary key
- 自带not null unique(非空且唯一)
- 一张表只有一个主键,当未主动写入primary key时会默认第一个not null unique(非空且唯一)的字段为主键
- 联合主键
- primary key(字段名1,字段名2,……)
-
自增:auto_increment
- 只对数字类型有效
- 写自增约束前的字段必须是唯一unique
- 一般自增都会与主键写一起:primary key auto_increment
- 一般是在id后面加该约束
-
外键:foreign key
- 将本表中的字段设置为外键,与外表中的字段进行连接
- 可以在foreign key前加constraint 外键名
- constraint fk_1 foreign key…….
- foreign key(本表中的字段) references 外表(字段名)
- 外键后面可以接如下方式
#cascade方式 在父表上update/delete记录时,同步update/delete掉子表的匹配记录 on delete cascade # 级连删除,一般不用 on update cascade # 级连更新 #set null方式 在父表上update/delete记录时,将子表上匹配记录的列设为null 要注意子表的外键列不能为not null on delete set null on update set null #No action方式 如果子表中有匹配的记录,则不允许对父表对应候选键进行update/delete操作 #Restrict方式 同no action, 都是立即检查外键约束 #Set default方式 父表有变更时,子表将外键列设置成一个默认的值 但Innodb不能识别
表与表之间的关系
- 一对多/多对一
- 直接设置外键
- 多对多
- 建立第三张表,表中设置两个外键,分别关联另外两张表的字段
- 一对一
- 直接设置外键,外键关联的字段必须约束为unique