Linux-MySQL数据类型&表操作

1.数据类型

1.1整型INT

|--------------|----------------------|---------------------|
| 数据类型 | 最小值 | 最大值 |
| TINYINT(n) | -128 | 127 |
| SMALLINT(n) | -32768 | 32767 |
| MEDIUMINT(n) | -8388608 | 8388607 |
| INT(n) | -2147483648 | 2147483647 |
| BIGINT(n) | -9223372036854775808 | 9223372036854775807 |
[tinyint、smallint、mediumint、int、bigint]

注意:

整型显示宽度:类型后面小括号内数字是显示最小宽度,不能限制插入数值的大小

如:int(2)---->表示输入int类型的值最小显示宽度为2,即输入各位数如1,则前面自动补0,实际显示01,也可以输入999,因为它是最小宽度,不是数值大小

整型类型的数值范围计算公式:

TINYINT,SMALLINT,MEDIUMINT,INT,BIGINT。分别使用8,16,24,32,64位存储空间

存储的值的范围从-2^(n-1)到2^(n-1)-1,其中n是存储空间的位数。

unsigned修饰符:不允许负值,可以让正数上限提高一倍,即2^(n-1)+2^(n-1)-1

1.2浮点类型FLOAT

FLOAT(M,D):M表示总数位,D表示小数位

ps:FLOAT(5,3)表示一共5位数(不算小数点),小数显示3位,整数只能<=2位(超出报错),会四舍五入

1.2.3浮点数类型与定点数类型的区别

1.3字符串类型CHAR&VARCHAR

|------------|-------------|
| CHAR | VARCHAR |
| 定长字符串 | 不定长字符串 |
| 读写块,占用多余空间 | 读写慢,不占用多余空间 |
| ps: CHAR(5):表示固定占用5个字符,如果插入小于5个字符则其余空间用空格代替,如果插入大于5个字符,显示超出范围 VARCHAR(5):表示固定占用5个字符,如果插入小于5个字符则按实际字符存储,如果插入大于5个字符,显示超出范围 ||
[CHAR和VARCHAR]

|----------|------|------------|----------|
| TINYTEXT | TEXT | MEDIUMTEXT | LONGTEXT |
| 用于存储大量文本 ||||
[文本类型]

使用建议:

1.经常变化的字段使用VARCHAR

2.知道固定长度的字段使用CHAR

3.超过255字符的只能用VARCHAR和TEXT

4.能用VARCHAR的地方不用TEXT

1.4枚举类型enum(固定多选一)

1.5日期类型

|------|------|------|----------|-----------|
| YEAR | DATE | TIME | DATETIME | TIMESTAMP |
| 年 | 日期 | 时间 | 日期时间 | 更详细的日期时间 |
[日期类型]

2.表约束

2.1约束类型

|----------------|-----------------|
| 约束条件 | 说明 |
| PRIMARY KEY | 主键,唯一,不可为空 |
| AUTO_INCREMENT | 自动增长(整数类型,且为主键) |
| UNIQUE KEY | 唯一,可以为空 |
| NOT NULL | 不能为空 |
| DEFAULT | 默认值 |
| FOREIGN KEY | 外键,实现表与表关联 |
[约束类型]

2.2主键约束&自增约束PRIMARY KEY&AUTO_INCREMENT(必须与主键组合使用)

特点:唯一,非空

添加主键:

语法:ALTER TABLE 表名 ADD PRIMARY KEY(字段名); -表存在时添加

CREATE TABLE 表名(字段名 类型, PRIMARY KEY(字段名)); -建表时添加

复制代码
ALTER user2 ADD PRIMARY KEY(id);    -给user2的id字段添加主键

CREATE TABLE user3(id int,name varchar(20),sex enum('男','女'), PRIMARY KEY(id));
为id字段添加主键
删除主键:

语法:ALTER TABLE 表名 DROP PRIMARY KEY;

复制代码
ALTER TABLE user5 DROP PRIMARY KEY;    -删除user5表的主键
删除自动增长

语法:ALTER TABLE 表名 MODIFY COLUMN 字段名 数据类型 约束条件;

ALTER TABLE 表名 CHANGE 旧字段名 新字段名 数据类型 约束条件;

复制代码
ALTER TABLE user1 MODIFY COLUMN id int not NULL;    -修改id字段为int类型非空

ALTER TABLE user1 CHANGE id ids int NOT NULL;    -修改id字段为ids,int类型,非空
单列主键:

单列主键字段值唯一且非空

复合主键:(多个主键)

复合主键字段值当所有主键值都与以前数据完全相同时才不唯一,显示报错且非空

自增约束(必须与主键组合使用)

起始值为1,每次增量为1

2.3唯一约束UNIQUE KEY(字段值不能重复)

添加单列唯一约束

语法:ALTER TABLE 表名 ADD UNIQUE KEY(列名);

复制代码
ALTER TABLE user1 ADD UNIQUE id;    -为id字段添加唯一约束
删除单列唯一约束

语法:ALTER TABLE 表名 DROP INDEX 字段名;

复制代码
ALTER TABLE user1 DROP INDEX id;    -删除id字段唯一约束

2.4NULL&NOT NULL(是否允许为空)

  1. 是否允许为空,默认NULL; 可设置NOT NULL,字段不允许为空,必须赋值

  2. 字段是否有默认值,MySQL默认的默认值是NULL,如果插入记录时不给字段赋值,此字段使用默认值

设置&修改NULL&NOT NULL约束

语法:ALTER TABLE 表名 ALTER COLUMN 字段名 SET 约束;

ALTER TABLE 表名 MODIFT 字段名 类型 约束;

复制代码
ALTER TABLE users ALTER COLUMN name SET NOT NULL;    -设置name字段非空

ALTER TABLE user8 MODIDY age INT NULL;    -设置age字段为int类型

2.5默认约束DEFAULT

设置&修改默认约束

语法:ALTER TABLE 表名 ALTER COLUMN 字段名 SET DEFAULT 新默认值;

复制代码
ALTER TABLE user9 ALTER COLUMN sex SET DEFAULT '女';    -修改sex字段默认值为女
删除默认约束

语法;ALTER TABLE 表名 ALTER COLUMN 字段名 DROP DEFAULT;

复制代码
ALTER TABLE user9 ALTER COLUMN sex DROP DEFAULT;    -删除sex字段默认值

2.6外键约束FOREIGN KEY(在从表使用)

  • 定义 :外键是用于建立和强制两个表之间链接 的约束,它指向另一个表的主键(或唯一键),用于保证数据的引用完整性
  • 作用
  • 防止出现无效的关联数据(比如在订单表中插入一个不存在的用户 ID);
  • 控制关联数据的删除 / 更新行为(比如删除用户时,是否级联删除其订单);
  • 核心术语
  • 主表(父表):被引用的表(比如用户表 users);
  • 从表(子表):引用主表的表(比如订单表 orders);
  • MySQL 注意事项 :外键约束仅在 InnoDB 存储引擎下生效,MyISAM 不支持外键。

|---------------------|---------------------|
| 操作 | 说明 |
| ON DELETE CASCADE | 主表删除记录,子表相关记录自动删除 |
| ON DELETE NO ACTION | 有子表记录时,禁止删除主表记录(默认) |
| ON UPDATE CASCADE | 主表主键更新,子表外键同步更新 |
| ON DELETE SET NULL | 主表删除记录,子表外键设为NULL |
[外键语句]

例1:定义主表user10与从表user11

主表user10

从表user11

修改操作

复制代码
想要修改外键先删除,再更新

1.删除外键
ALTER TABLE orders 
DROP FOREIGN KEY fk_orders_user_id;

2.跟新规则
ALTER TABLE orders 
ADD CONSTRAINT fk_orders_user_id --约束名 
FOREIGN KEY (user_id)  --本表外键
REFERENCES users(user_id) --关联表外键
ON DELETE CASCADE  -- 删除主表用户,从表关联订单也被删除
ON UPDATE CASCADE; -- 更新主表user_id时,从表关联数据同步更新

2.7CHECK约束

  • 定义:CHECK 约束用于限制列中值的范围,强制列的数据必须满足指定的条件。
  • 作用 :保证列数据的域完整性(比如年龄必须是正数、性别只能是男 / 女)。
  • MySQL 注意事项
    • MySQL 8.0.16 之前的版本,CHECK 约束语法支持但不生效(仅做语法校验,实际不限制数据);
    • MySQL 8.0.16 及以后版本,CHECK 约束完全生效,替代了之前常用的 ENUM、触发器等方案。
添加/删除CHECK约束
复制代码
1.添加CHECK服务
ALTER TABLE students 
ADD CONSTRAINT chk_stu_name_not_empty 
CHECK (stu_name <> '');

2.删除CHECK服务
ALTER TABLE students DROP CONSTRAINT chk_stu_name_not_empty;

2.6各种约束添加&删除语法总结

|--------------|--------------------------------------------------------|-----------------------------------------------|
| 约束类型 | 添加语法 | 删除语法 |
| 主键约束 | ALTER TABLE 表 ADD PRIMARY KEY(列) | ALTER TABLE 表 DROP PRIMARY KEY |
| 唯一约束 | ALTER TABLE 表 ADD UNIQUE(列) | ALTER TABLE 表 DROP INDEX 约束名 |
| 默认值 | ALTER TABLE 表 ALTER COLUMN 列 SET DEFAULT 值 | ALTER TABLE 表 ALTER COLUMN 列 DROP DEFAULT |
| NOT NULL | ALTER TABLE 表 MODIFY COLUMN 列 类型 NOT NULL | ALTER TABLE 表 MODIFY COLUMN 列 类型 NULL |
| 自增 | ALTER TABLE 表名 MODIFY COLUMN 列名 类型 AUTO_INCREMENT | ALTER TABLE 表名 MODIFY COLUMN 列名 类型; |
| 检查约束 | ALTER TABLE 表 ADD CONSTRAINT 约束名 CHECK(条件) | ALTER TABLE表 DROP CONSTRAINT 约束名 |
| 外键约束 | ALTER TABLE 子表 ADD FOREIGN KEY(列) REFERENCES 父表(列) | ALTER TABLE 表 DROP FOREIGN KEY 约束名 |
[约束管理速查表]

总结:

修改&添加字段/约束:ALTER TABEL 表名 MODIFY COLUMN 字段名 类型 约束;

添加&删除主键、唯一等约束:ALTER TABEL 表名 ADD 约束 (字段名);

ALTER TABEL 表名 DROP 约束 (字段名);

3.表基本操作

3.1添加字段

语法:ALTER TABLE 表名 ADD 字段名 类型 约束;

复制代码
ALTER TABLE user1 ADD math INT;    -添加math字段

ALTER TABLE user1 ADD (math INT,english CHAR);    -添加math与english字段

ALTER TABLE user1 ADD id INT AFTER home;    -添加字段id到home字段后

ALTER TABLE user1 ADD uid CHAR(8) FIRST;    -添加字段uid到第一个字段

3.2修改字段和类型

语法:ALTER TABLE 表名 MODIFY 字段名 类型 约束;

ALTER TABLE 表名 CHANGE 旧字段名 新字段名 类型 约束;

ALTER TABLE 表名 DROP 字段名

复制代码
ALTER TABLE user1 MODIFY name VARCHAR(20) NOT NULL;    -修改name类型与约束

ALTER TABLE user1 MODIFY num INT AFTER hostname;    -修改num类型为INT,在HOSTNAME字段后

ALTER TABLE user1 CHANGE name name1 CHAR(8) UNIQUE KEY;    -修改name为name1设置类型CHAR(8),唯一

ALTER TABEL user1 DROP name;    -删除name字段

3.3表复制

CREATE TABLE 表名 LIKE 源表名; -只复制表结构
CREATE TABLE 表名 LIKE 源表名;

INSERT INTO 表名 SELECT * FROM 源表名; -完全复制源表的结构与数据
CREATE TABLE user2 LIKE user1;

INSERT INTO 表名(字段1,字段2) SELECT 字段1,字段2 FROM 源表名; -完全复制源表的结构,只复制部分数据

复制代码
CREATE TABLE user2 LIKE user1;    -复制user1的表结构

CREATE TABLE user2 LIKE user1;
INSERT INTO user2 SELECT * FROM user1;    -完全复制user1表的结构与数据

CREATE TABLE user2 LIKE user1;
INSERT INTO user2(id,name) SELECT id,name FROM user1;    -完全复制user1表的结构,只复制部分数据

3.4删除表

语法:DROP TABLE 表名;

复制代码
DROP TABLE user1;    -删除user1表

4.数据操作

4.1增删改

语法:INSERT INTO 表名(字段1,字段2..)VALUES (字段1值,字段2值),(字段1值,字段2值)

UPADTE 表名 SET 修改的字段 WHERE 给谁修改

DELETE FROM 表名 WHERE 删除哪个

复制代码
INSERT INTO user1 VALUES (1,'jack');    -插入一条记录

INSERT INTO user1(id,name) VALUES (1,'jack');    -指定字段插入一条记录

INSERT INTO user1(id,name) VALUES (1,'jack'),(2,'tom');    -指定字段插入多条记录

UPDATE user1 SET name=tony WHERE id=2;    -更新user1表中字段id=2的name字段叫tony

UPDATE user1 SET name=tony;    -更新user1表中所有name字段叫tony

DELETE FROM user1 WHERE id=1;    -删除user1表中id=1的数据

DELETE FROM user1;    -删除整个user1表的数据
相关推荐
小陈工1 小时前
Python Web开发入门(十七):Vue.js与Python后端集成——让前后端真正“握手言和“
开发语言·前端·javascript·数据库·vue.js·人工智能·python
0xDevNull5 小时前
MySQL数据冷热分离详解
后端·mysql
科技小花5 小时前
数据治理平台架构演进观察:AI原生设计如何重构企业数据管理范式
数据库·重构·架构·数据治理·ai-native·ai原生
一江寒逸5 小时前
零基础从入门到精通MySQL(中篇):进阶篇——吃透多表查询、事务核心与高级特性,搞定复杂业务SQL
数据库·sql·mysql
D4c-lovetrain5 小时前
linux个人心得22 (mysql)
数据库·mysql
阿里小阿希6 小时前
CentOS7 PostgreSQL 9.2 升级到 15 完整教程
数据库·postgresql
荒川之神6 小时前
Oracle 数据仓库雪花模型设计(完整实战方案)
数据库·数据仓库·oracle
做个文艺程序员6 小时前
MySQL安全加固十大硬核操作
数据库·mysql·安全
不吃香菜学java6 小时前
Redis简单应用
数据库·spring boot·tomcat·maven
一个天蝎座 白勺 程序猿7 小时前
Apache IoTDB(15):IoTDB查询写回(INTO子句)深度解析——从语法到实战的ETL全链路指南
数据库·apache·etl·iotdb