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);

員工表

(五)約束_小結

小結

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章