1、约束
设置主键
create table student(
id int primary key,
name varchar(20));
create table student(
id int,
name varchar(20),
primary key(id));
create table student(
id int,
name varchar(20),
constraint pk primary key(id));
修改某一列为主键
alter table student add primary key(id);
alter table student modify id int primary key;
#修改列类型
alter table student change id id int primary key;
#修改列名称和类型
删除主键约束
ALTER TABLE 表名称 DROP PRIMARY KEY; [mysql 8.0.22 之后的版本]
ALTER TABLE 表名称 DROP INDEX PRIMARY KEY; [mysql 8.0.22 之前的版本
alter table student drop primary key;
自增长列
create table goods(
no int primary key auto_increment,
name varchar(20));
insert into goods values('苹果'),('笔记本'),('白菜'),('车厘子'),('鼠标');
标识列可以通过
SET auto_increment_increment = 3; 设置步长(全局)
修改为自增长列
1、
alter table goods modify no int auto_increment;
2、
alter table goods change no no int auto_increment ;
删除自增长列
alter table 表名 modify 字段名 字段名类型;
联合主键
create table text(
student_id int,
course_id int,
enrollment varchar(20),
primary key(student_id,course_id));
2、唯一约束
对于非主键列中的值也要求唯一性时,就需要唯一约束
CREATE TABLE `table_name` (
`id` int,
`name` varchar(20) UNIQUE # 唯一约束
);
CREATE TABLE `table_name` (
`id` int,
`name` varchar(20),
CONSTRAINT uq UNIQUE(name) #唯一约束
);
修改表
ALTER TABLE 表名 ADD UNIQUE(列名称);
ALTER TABLE 表名 ADD CONSTRAINT [constraint_name] UNIQUE(列名称);
ALTER TABLE 表名 CHANGE [COLUMN] 列名 列名 类型 UNIQUE;
ALTER TABLE 表名 MODIFY [COLUMN] 列名 列类型 UNIQUE;
删除唯一约束
ALTER TABLE 表名称 DROP INDEX 设置唯一时的名称;
##如果没有设置约束名称,名称默认是字段名
唯一约束允许有多个 NULL 值
3、默认约束
为列中的值设置默认值, DEFAULT value
alter table hy modify name varchar(20) default 'xxx';
修改表
ALTER TABLE 表名 MODIFY [COLUMN] 列名 列类型 DEFAULT 默认值;
ALTER TABLE 表名 CHANGE 列名 列名 列类型 DEFAULT 默认值;
删除
ALTER TABLE 表名 MODIFY [COLUMN] 列名 列类型;
ALTER TABLE 表名 ALTER COLUMN 列名 DROP DEFAULT;
ALTER TABLE 表名 ALTER COLUMN 列名 SET DEFAULT NULL;
4、非空约束
NOT NULL :非空,用于保证该字段的值不能为空。
CREATE TABLE `table_name` (
`id` int NOT NULL, # 非空约束
`name` varchar(20),
);
ALTER TABLE 表名 MODIFY [COLUMN] 列名 列类型 NOT NULL;
ALTER TABLE 表名 CHANGE 列名 列名 列类型 NOT NULL;
-- 删除
ALTER TABLE 表名 MODIFY [COLUMN] 列名 列类型 [null];
5、检查约束
检查约束
create table employees (
-> id int auto_increment primary key,
-> name varchar(50),
-> age int,
-> email varchar(100),
-> check (age >=18));
删除检查约束
alter table 表名 drop constraint 约束名;
修改表的时候
alter table 表名 modify 列名 类型 check(约束条件);
alter table 表名 change 列名 列名 类型 check(约束条件);
alter tabler 表名 add constraint 列名 check(约束条件);
6、外键约束
alter table emp add constraint fk_emp_dept foreign key(dept_no) references dept(no);
外键约束出现错误
这个错误信息是由于在向emp
表中插入或更新数据时,出现了外键约束错误。错误原因是正在插入或更新的数据中,dept_no
列的值在dept
表的no
列中找不到匹配的主键值。
要解决这个错误,您可以采取以下几个步骤:
- 确保目标表中的主键值存在:检查
dept
表中的主键列no
,确保要插入或更新的emp
表中的dept_no
列的值存在于dept
表中。 - 检查数据类型和长度匹配:确保
emp
表的dept_no
列和dept
表的no
列具有相同的数据类型和长度限制。 - 检查插入或更新的数据:检查要插入或更新的数据行中
dept_no
列的值是否正确,并且存在于dept
表中。 - 检查插入或更新的顺序:如果存在多个表之间的外键关系,确保先插入或更新被引用的表,再插入或更新引用该表的表。
删除
ALTER TABLE 表名称 DROP FOREIGN KEY 索引名 ;# 设置外键时的名称
级联删除/更新
alter table emp add constraint fk_name foreign key(dept_no) references dept(no) on delete cascade;
delete from dept where no=1;#将从表中dept_no也同时删除了
删之前:
删之后:
7、聚合函数
sum : 求和
select sum(列) from table_name [其他子句];
max : 求最大值
select max(列) from table_name [其他子句];
min : 求最小值
select min(列) from table_name [其他子句];
avg : 求平均值
select avg(列) from table_name [其他子句];
count : 求数量
select count(列) from table_name [其他子句]; 1
group by
1、group by 是对数据进行分组,分组时,表中有相同值的分为一组。分组后可以进行
聚合查询。
2、group by 分组后的查询中, select 的列不能出现除了 group by 分组条件以及聚
合函数外的其他列。
select 列1, 列2, (聚合函数) from table_name group by 列1, 列2;
having
having 是对 group by 分组后的结果集进行筛选。
select 列1, 列2, (聚合函数) from table_name group by 列1, 列2 having
select count(列) from table_name [其他子句]; 1
### group by
1、group by 是对数据进行分组,分组时,表中有相同值的分为一组。分组后可以进行
聚合查询。
2、group by 分组后的查询中, select 的列不能出现除了 group by 分组条件以及聚
合函数外的其他列。
select 列1, 列2, (聚合函数) from table_name group by 列1, 列2;
### **having**
having 是对 group by 分组后的结果集进行筛选。
select 列1, 列2, (聚合函数) from table_name group by 列1, 列2 having
分组后条件;