约束
- 概念:对表中的数据进行限定,保证数据的正确性,有效性,完整性。
分类:
1.主键约束:primary key
注意:
- 含义:非空并且唯一(就是不能为null值,和不能重复)
- 一张表中只能有一个字段为主键
- 主键就是表中记录的唯一标识
1》在创建表时,添加主键约束
-- 创建一张表,并添加主键(就是创建表时添加主键)(primary key)
CREATE TABLE IF NOT EXISTS eeje(
id INT PRIMARY KEY,
NAME VARCHAR(32)
);
2》删除主键
-- 删除主键
ALTER TABLE 表名 CHANGE id id INT; -- 说明这种方式不能删除主键
ALTER TABLE 表名 DROP PRIMARY KEY; -- 这种方式才对,不用加主键名字是因为一张表中只有一个主键
3》创建表后,再添加主键
-- 创建表eeje
CREATE TABLE IF NOT EXISTS eeje(
id INT,
NAME VARCHAR(32)
);
-- 给表中的id添加主键
ALTER TABLE 表名 CHANGE id id int PRIMARY KEY;
自动增长: auto_increment一般和主键一起使用
1.概念:如果某一列是数值类型的,使用auto_increment可以来完成值的自动增长。
2.在创建表时,添加主键约束,并且完成主键自动增长
-- 主键中的自动增长区
-- 创建表eeje并且给id添加主键和自动增长
CREATE TABLE IF NOT EXISTS eeje(
id INT PRIMARY KEY AUTO_INCREMENT,
NAME VARCHAR(32)
);
-- 向表中添加数据
INSERT INTO eeje VALUE(01,"udeeje");
-- 查询表中的数据
SELECT * FROM eeje;
-- 再向表中添加数据
INSERT INTO eeje VALUE(NULL,"haikang"); -- 因为什么可以为null值呢?由于主键上添加auto_increment所以可以为null值,不然主键上不能为null值
3.删除自动增长
-- 删除主键中的自动增长:auto_increment
ALTER TABLE eeje CHANGE id id INT;
不能为空的报错
-- Column 'id' cannot be null说明主键不能空
4.添加自动增长
-- 添加主键中的自动增长:auto_increment
ALTER TABLE eeje CHANGE id id INT AUTO_INCREMENT;
代码总结区:
-- 主键区
-- 创建一张表,并添加主键(就是创建表时添加主键)(primary key)
CREATE TABLE IF NOT EXISTS eeje(
id INT PRIMARY KEY,
NAME VARCHAR(32)
);
-- 向表中添加数据
INSERT INTO eeje (id,NAME) VALUE("01","张三"),("02","李四");
-- 查询表中所有数据
SELECT * FROM eeje;
-- 再向表中添加数据为(01,"王五")
INSERT INTO eeje VALUE(01,"王五"); -- 说明表中已经存在01的主键不能再添加了
-- 删除主键
ALTER TABLE eeje CHANGE id id INT; -- 说明这种方式不能删除主键
ALTER TABLE eeje DROP PRIMARY KEY; -- 这种方式才对,不用加主键名字是因为一张表中只有一个主键
-- 向表中添加主键
ALTER TABLE eeje CHANGE id id int PRIMARY KEY; -- 不能添加主键的因为是表中有重复的元素
-- 清空表中所有元素
DELETE FROM eeje;
-- 删除表eeje
DROP TABLE eeje;
-- 查询所有表
SHOW TABLES;
-- 创建表eeje
CREATE TABLE IF NOT EXISTS eeje(
id INT,
NAME VARCHAR(32)
);
-- 向表中添加数据
INSERT INTO eeje VALUE(01,"haikang"),(02,"udeeje");
-- 给表中的id添加主键
ALTER TABLE eeje CHANGE id VARCHAR(32) int PRIMARY KEY;
-- 向表中添加(01,"邓宇瑞") 报错的因为是01主键已经存在
INSERT INTO eeje VALUE(01,"邓宇瑞"); -- Duplicate entry '1' for key 'PRIMARY'报重复的错误
-- 删除表中的主键
ALTER TABLE eeje DROP PRIMARY KEY;
-- 主键中的自动增长区
-- 创建表eeje并且给id添加主键和自动增长
CREATE TABLE IF NOT EXISTS eeje(
id INT PRIMARY KEY AUTO_INCREMENT,
NAME VARCHAR(32)
);
-- 向表中添加数据
INSERT INTO eeje VALUE(01,"udeeje");
-- 查询表中的数据
SELECT * FROM eeje;
-- 再向表中添加数据
INSERT INTO eeje VALUE(NULL,"haikang"); -- 因为什么可以为null值呢?由于主键上添加auto_increment所以可以为null值,不然主键上不能为null值
-- 删除主键中的自动增长:auto_increment
ALTER TABLE eeje CHANGE id id INT;
-- Column 'id' cannot be null说明主键不能空
-- 添加主键中的自动增长:auto_increment
ALTER TABLE eeje CHANGE id id INT AUTO_INCREMENT;
2.非空约束:not null
非空约束是某一例的值不能为null
- 创建表时添加约束
-- 创建一张表,并在创建时对name字段添加约束
CREATE TABLE stu(
id INT,
NAME VARCHAR(32) NOT NULL
);
2.创建表完后,添加非空约束
-- 创建一张表stu,没有对name指明约束
CREATE TABLE IF NOT EXISTS stu(
id INT,
NAME VARCHAR(32)
);
-- 向表中添加张三、李四
INSERT INTO stu (id,NAME) VALUE(1,"张三"),(2,'李四');
-- 表创建完成后,向表中添加name的约束
ALTER TABLE stu CHANGE NAME NAME VARCHAR(32) NOT NULL;
3.删除的非空约束
-- 删除表中name的not null约束
ALTER TABLE stu CHANGE NAME NAME VARCHAR(32);
-- 2021.10.23 晚上
-- 约束区
-- 约束中的非空约束
-- 创建一张表,并在创建时对name字段添加约束
CREATE TABLE stu(
id INT,
NAME VARCHAR(32) NOT NULL
);
-- 查询表结构
DESC stu;
-- 查询表中所有数据
SELECT * FROM stu;
-- 向表中添加数据;张三李四
INSERT INTO stu(id,NAME) VALUE(1,'张三'),(2,'李四');
-- 向表中添加一个没有名字的数据
INSERT INTO stu(id) VALUE(3); -- Field 'name' doesn't have a default value;说明name值不为null
-- 删除表中name的not null约束
ALTER TABLE stu CHANGE NAME NAME VARCHAR(32);
-- 删除表stu
DROP TABLE IF EXISTS stu;
-- 创建一张表stu,没有对name指明约束
CREATE TABLE IF NOT EXISTS stu(
id INT,
NAME VARCHAR(32)
);
-- 向表中添加张三、李四
INSERT INTO stu (id,NAME) VALUE(1,"张三"),(2,'李四');
-- 表创建完成后,向表中添加name的约束
ALTER TABLE stu CHANGE NAME NAME VARCHAR(32) NOT NULL;
-- 向表中添加一个没有名字的数据
INSERT INTO stu (id) VALUE(3);-- Field 'name' doesn't have a default value;说明name值不为null
3.唯一约束:unique
某一列的值不能重复
1.注意的是:唯一约束可以有null值,但是只能有一条为null值
2.在创建表时添加唯一约束
-- 在创建表时添加唯一约束,向电话号码添加唯一约束
CREATE TABLE IF NOT EXISTS stu(
NAME VARCHAR(32),
phone_number VARCHAR(20) UNIQUE -- 向电话号码添加唯一约束
);
3.删除唯一约束:删除唯一约束的语法是
alter table 表名 drop index 列名
-- 删除唯一约束
ALTER TABLE stu CHANGE phone_number phone_number VARCHAR(20); -- 注意该语法对删除唯一约束不起作用
ALTER TABLE stu DROP INDEX phone_number; -- 删除唯一约束的真正语法
4.在表创建完成后,添加唯一约束
-- 创建一张表完成后,再添加唯一约束
CREATE TABLE stu (
NAME VARCHAR(32),
phone_number VARCHAR(20)
);
-- 向表中的电话添加唯一约束
ALTER TABLE stu CHANGE phone_number phone_number VARCHAR(20) UNIQUE;
-- 向表中添加张三、李四数据
INSERT INTO stu (NAME,phone_number) VALUE('张三',"18988888888"),("李四",'18966668888');
-- 查询表中所有的数据
SELECT * FROM stu;
-- -- 向表中添加没有电话号码的数据;说明在唯一约束中可以存在一条null的记录
INSERT INTO stu (NAME,phone_number) VALUE('王五','18988888888'); -- Duplicate entry '13888888888' for key 'phone_number'报错是因为‘13888888888’已经存在
INSERT INTO stu (NAME,phone_number) VALUE('赵六','13888888888');
4.外键约束:foreign key
让表与表之间产生关系,从而保证数据的正确性;注意是外键值可以为null,但是不能为不存在的的外键值。
1.在创建表时,可以添加外键
语法:
create table 表名(
id int,
name varchar(32),
外键列,
constraint 外键名称 foreign key (外键列名称) references 主表名称(主表列名称)
);
constraint 外键名(自己取) foreign key (外键列) references 主表名称(主表列名称(一般是id))
-- 创建departement表包含字段(id,dep_name,dep_location)
CREATE TABLE IF NOT EXISTS departement (
id INT PRIMARY KEY AUTO_INCREMENT,
dep_name VARCHAR(32),
dep_location VARCHAR(32)
);
-- 创建employee表包含字段(id,name,age,dep_id)(注意的是先有外表,才能外键约束,就是先有部门表,员工表的部门id才能关联)
CREATE TABLE IF NOT EXISTS employee(
id INT PRIMARY KEY AUTO_INCREMENT,
NAME VARCHAR(32),
age INT,
dep_id INT, -- 外键对应主表的主键
CONSTRAINT emp_dep_fk FOREIGN KEY (dep_id) REFERENCES departement(id) -- 添加外键约束
);
2.删除外键
later table 表名 drop foreign key 外键名;
-- 删除外键约束
ALTER TABLE employee DROP FOREIGN KEY emp_dep_fk;
3.添加外键
later table 表名 add constraint 外键名 foreign key (外键字段列) referenes 主表名称(主表列名称);
-- 添加外键约束
-- CONSTRAINT emp_dep_fk FOREIGN KEY (dep_id) REFERENCES departement(id) -- 添加外键约束
ALTER TABLE employee ADD CONSTRAINT emp_dep_fk FOREIGN KEY (dep_id) REFERENCES departement (id);
级联操作:
添加级联操作语法:
alter table 表名 add constraint 外键名称 foreign key (外键字段列名称) references 主表名称(主表列名称) on update cascade no delete cascade;
级联分类:
on update cascade:更新级联(添加级联)
no delete cascade:删除级联
注意是:级联更新和级联删除可以分开添加,也可以一起添加