Linux-MySQL数据类型&表操作
主表user10从表user11修改操作想要修改外键先删除,再更新1.删除外键2.跟新规则ADD CONSTRAINT fk_orders_user_id --约束名FOREIGN KEY (user_id) --本表外键REFERENCES users(user_id) --关联表外键ON DELETE CASCADE -- 删除主表用户,从表关联订单也被删除-- 更新主表user_id时,从表
1.数据类型
1.1整型INT
| 数据类型 | 最小值 | 最大值 |
| TINYINT(n) | -128 | 127 |
| SMALLINT(n) | -32768 | 32767 |
| MEDIUMINT(n) | -8388608 | 8388607 |
| INT(n) | -2147483648 | 2147483647 |
| BIGINT(n) | -9223372036854775808 | 9223372036854775807 |
注意:
整型显示宽度:类型后面小括号内数字是显示最小宽度,不能限制插入数值的大小
如: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个字符,显示超出范围 |
|

| 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 表名 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 (列名);
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 表名 |
ALTER TABLE 表名 |
| 检查约束 | 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 表名 SELECT * FROM 源表名; -复制表结构与数据
CREATE TABLE 表名 SELECT 源表字段 FROM 源表; -复制指定字段
ALTER TABLE user2 LIKE user1; -复制user1的表结构
ALTER TABLE user2 SELECT * FROM user1; -复制user1表的结构与数据
ALTER TABLE user2 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
DROP FROM user1 WHERE id=1; -删除user1表中id=1的数据
DROP FROM user1; -删除整个user1表的数据
更多推荐



所有评论(0)