MySQL基础(三)【约束】

MySql约束

补充一个mysql中约束和索引的关系!!

Content

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

  1. 主键约束:primary key
  2. 非空约束:not null
  3. 唯一约束:unique
  4. 外键约束:foreign key

(一)非空约束:not null

		SELECT DATABASE();  -- 查看当前的数据库
		
		-- 1.创建表时添加约束
		CREATE TABLE stu(
			id INT,
			NAME VARCHAR(20) NOT NULL     -- name为非空
		);
		
		-- 2.创建表完了之后,添加非空约束
		ALTER TABLE stu MODIFY NAME VARCHAR(20) NOT NULL;
		
		-- 3.删除name的非空约束
		ALTER TABLE stu MODIFY NAME VARBINARY(20);  
		SELECT * FROM stu;

(二)唯一约束:unique

		DROP TABLE stu;  -- 删掉,重新建表
		
		-- 1.在建表时添加:唯一约束
		CREATE TABLE stu(
			id INT,
			phone VARCHAR(20) UNIQUE     -- 添加唯一约束,法一
		);
		
		-- 2.在建表完后,添加唯一约束:
		ALTER TABLE stu MODIFY phone VARCHAR(20) UNIQUE;   -- 此时也可以添加约束唯一,法二
		
		-- 3.删除唯一约束:(注意:和删除非空约束的方法不同)
		ALTER TABLE stu DROP INDEX phone ;

(三)主键约束:表中各记录的唯一标识,必须非空

		-- 1.创建表时,添加主键约束
		CREATE TABLE stu(
			id INT PRIMARY KEY,    -- 给id添加主键约束:
			NAME VARCHAR(20)  
		);
		
		-- 2.创建表之后,再添加主键约束
		ALTER TABLE stu MODIFY id INT PRIMARY KEY;
		
		-- 3.删除主键约束:[方法比较特殊]
		ALTER TABLE stu DROP PRIMARY KEY;

(四)外键约束

(1)单表的缺点:数据冗余
		CREATE TABLE emp ( 
			id INT PRIMARY KEY AUTO_INCREMENT, 
			NAME VARCHAR(30), age INT, 
			dep_name VARCHAR(30), 
			dep_location VARCHAR(30) 
		);
		 -- 添加数据 
		 INSERT INTO emp (NAME, age, dep_name, dep_location) VALUES ('张三', 20, '研发部', '广州'); 
		 INSERT INTO emp (NAME, age, dep_name, dep_location) VALUES ('李四', 21, '研发部', '广州'); 
		 INSERT INTO emp (NAME, age, dep_name, dep_location) VALUES ('王五', 20, '研发部', '广州'); 
		 INSERT INTO emp (NAME, age, dep_name, dep_location) VALUES ('老王', 20, '销售部', '深圳'); 
		 INSERT INTO emp (NAME, age, dep_name, dep_location) VALUES ('大王', 22, '销售部', '深圳'); 
		 INSERT INTO emp (NAME, age, dep_name, dep_location) VALUES ('小王', 18, '销售部', '深圳');
		 
		 SELECT * FROM emp;   -- 此表数据较为冗余

创建一个单表

(2)解决办法:拆分成两个表

1.从表中,使用外键关联主表中的主键
2.级联操作,在修改和更新主表的主键时,同时更新或删除从表的外键值

		 -- 1.创建主表
		 CREATE TABLE department(
			id INT PRIMARY KEY AUTO_INCREMENT,
			dep_name VARCHAR(20),
			dep_location VARCHAR(20)
		 );

		 -- 添加2个部门
		INSERT INTO department VALUES(NULL, '研发部','广州'),(NULL, '销售部', '深圳');
		SELECT * FROM department;
		

在这里插入图片描述

		 -- 2. 创建员工表
		 CREATE TABLE employee(
			id INT PRIMARY KEY AUTO_INCREMENT,
			NAME VARCHAR(20),
			age INT,
			dep_id INT ,         -- 外键对应主表的主键
			-- 创建外键约束
			CONSTRAINT emp_depid_fk FOREIGN KEY (dep_id) REFERENCES department(id)    -- 外键约束:只能出现与主表中一致的主键id
			ON UPDATE CASCADE ON DELETE CASCADE                         -- 级联操作,在修改和更新主表的主键时,同时更新或删除附表的外键值
		)

在这里插入图片描述


			-- 添加员工,dep_id表示员工所在的部门
			INSERT INTO employee (NAME, age, dep_id) VALUES ('张三', 20, 1);
			INSERT INTO employee (NAME, age, dep_id) VALUES ('李四', 21, 1);
			INSERT INTO employee (NAME, age, dep_id) VALUES ('王五', 20, 1);
			INSERT INTO employee (NAME, age, dep_id) VALUES ('老王', 20, 2);
			INSERT INTO employee (NAME, age, dep_id) VALUES ('大王', 22, 2);
			INSERT INTO employee (NAME, age, dep_id) VALUES ('小王', 18, 2);

员工表

(五)约束_小结

小结

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值