sql中的约束问题

约束

  • 概念:对表中的数据进行限定,保证数据的正确性,有效性,完整性。

分类:

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

  1. 创建表时添加约束
-- 创建一张表,并在创建时对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:删除级联
注意是:级联更新和级联删除可以分开添加,也可以一起添加
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值