数据约束
?
默認值
注意: 1)對默認值字段插入null是可以的。2)對默認值字段可以插入非null?
-- 1.1 默認值 CREATE TABLE student(id INT,NAME VARCHAR(20),address VARCHAR(20) DEFAULT '廣州天河' -- 默認值 )DROP TABLE student; -- 當字段沒有插入值的時候,mysql自動給該字段分配默認值 INSERT INTO student(id,NAME) VALUES(1,'張三');-- 注意:默認值的字段允許為null INSERT INTO student(id,NAME,address) VALUE(2,'李四',NULL); INSERT INTO student(id,NAME,address) VALUE(3,'王五','廣州番禺');?
非空
注意:1)非空字符必須賦值2)非空字符不能賦null?
-- 1.2 非空 -- 需求: gender字段必須有值(不為null) CREATE TABLE student(id INT,NAME VARCHAR(20),gender VARCHAR(2) NOT NULL -- 非空 )-- 非空字段必須賦值 INSERT INTO student(id,NAME) VALUES(1,'李四'); -- 非空字符不能插入null INSERT INTO student(id,NAME,gender) VALUES(1,'李四',NULL);?
唯一
注意:1)唯一字段可以插入null 2)唯一字段可以插入多個null?
-- 1.3 唯一 CREATE TABLE student(id INT UNIQUE, -- 唯一NAME VARCHAR(20) )INSERT INTO student(id,NAME) VALUES(1,'zs'); INSERT INTO student(id,NAME) VALUES(1,'lisi'); -- ERROR 1062 (23000): Duplicate entry '1' for key 'id'INSERT INTO student(id,NAME) VALUES(2,'lisi');?
主鍵
作用: 非空+唯一注意: 1)通常情況下,每張表都會設置一個主鍵字段。用于標記表中的每條記錄的唯一性。2)建議不要選擇表的包含業務含義的字段作為主鍵,建議給每張表獨立設計一個非業務含義的 id字段。?
-- 1.4 主鍵(非空+唯一) DROP TABLE student;CREATE TABLE student(id INT PRIMARY KEY, -- 主鍵NAME VARCHAR(20) )INSERT INTO student(id,NAME) VALUES(1,'張三'); INSERT INTO student(id,NAME) VALUES(2,'張三'); -- INSERT INTO student(id,NAME) VALUES(1,'李四'); -- 違反唯一約束: Duplicate entry '1' for key 'PRIMARY'-- insert into student(name) value('李四'); -- 違反非空約束: ERROR 1048 (23000): Column 'id' cannot be null?
自增長
-- 1.5 自增長 CREATE TABLE student(id INT(4) ZEROFILL PRIMARY KEY AUTO_INCREMENT, -- 自增長,從0開始 ZEROFILL 零填充NAME VARCHAR(20) )-- 自增長字段可以不賦值,自動遞增 INSERT INTO student(NAME) VALUES('張三'); INSERT INTO student(NAME) VALUES('李四'); INSERT INTO student(NAME) VALUES('王五');SELECT * FROM student; -- 不能影響自增長約束 DELETE FROM student; -- 可以影響自增長約束 TRUNCATE TABLE student;?
外鍵
作用:約束兩種表的數據出現兩種表的情況:解決數據冗余高問題: 獨立出一張表 例如: 員工表 和 部門表問題出現:在插入員工表數據的時候,員工表的部門ID字段可以隨便插入!!!!! 使用外鍵約束:約束插入員工表的部門ID字段值解決辦法: 在員工表的部門ID字段添加一個外鍵約束?
-- 部門表(主表) CREATE TABLE dept(id INT PRIMARY KEY,deptName VARCHAR(20) )-- 修改員工表(副表/從表) CREATE TABLE employee(id INT PRIMARY KEY,empName VARCHAR(20),deptId INT,-- 把部門名稱改為部門ID-- 聲明一個外鍵約束CONSTRAINT emlyee_dept_fk FOREIGN KEY(deptId) REFERENCES dept(id)-- 外鍵名稱 外鍵 參考表(參考字段) )?
注意:1)被約束的表稱為副表,約束別人的表稱為主表,外鍵設置在副表上的!!!2)主表的參考字段通用為主鍵!3)添加數據: 先添加主表,再添加副表4)修改數據: 先修改副表,再修改主表5)刪除數據: 先刪除副表,再刪除主表?
外鍵約束
-- 1.6 外鍵約束 -- 員工表 CREATE TABLE employee(id INT PRIMARY KEY,empName VARCHAR(20),deptName VARCHAR(20) -- 部門名稱 )INSERT INTO employee VALUES(1,'張三','軟件開發部'); INSERT INTO employee VALUES(2,'李四','軟件開發部'); INSERT INTO employee VALUES(3,'王五','應用維護部');SELECT * FROM employee;-- 添加員工,部門名稱的數據冗余高 INSERT INTO employee VALUES(4,'陳六','軟件開發部');-- 解決數據冗余高的問題:給冗余的字段放到一張獨立表中 -- 獨立設計一張部門表 CREATE TABLE dept(id INT PRIMARY KEY,deptName VARCHAR(20) )DROP TABLE employee;-- 修改員工表 CREATE TABLE employee(id INT PRIMARY KEY,empName VARCHAR(20),deptId INT,-- 把部門名稱改為部門ID-- 聲明一個外鍵約束CONSTRAINT emlyee_dept_fk FOREIGN KEY(deptId) REFERENCES dept(id) ON UPDATE CASCADE ON DELETE CASCADE-- ON CASCADE UPDATE :級聯修改-- 外鍵名稱 外鍵 參考表(參考字段) )INSERT INTO dept(id,deptName) VALUES(1,'軟件開發部'); INSERT INTO dept(id,deptName) VALUES(2,'應用維護部'); INSERT INTO dept(id,deptName) VALUES(3,'秘書部');INSERT INTO employee VALUES(1,'張三',1); INSERT INTO employee VALUES(2,'李四',1); INSERT INTO employee VALUES(3,'王五',2); INSERT INTO employee VALUES(4,'陳六',3);-- 問題: 該記錄業務上不合法,員工插入了一個不存在的部門數據 INSERT INTO employee VALUES(5,'陳六',4); -- 違反外鍵約束:
Cannot add or update a child row: a foreign key constraint fails
(`day16`.`employee`, CONSTRAINT `emlyee_dept_fk` FOREIGN KEY (`deptId`) REFERENCES `dept` (`id`))-- 1)當有了外鍵約束,添加數據的順序: 先添加主表,再添加副表數據 -- 2)當有了外鍵約束,修改數據的順序: 先修改副表,再修改主表數據 -- 3)當有了外鍵約束,刪除數據的順序: 先刪除副表,再刪除主表數據 -- 修改部門(不能直接修改主表) UPDATE dept SET id=4 WHERE id=3; -- 先修改員工表 UPDATE employee SET deptId=2 WHERE id=4;-- 刪除部門 DELETE FROM dept WHERE id=2;-- 先刪除員工表 DELETE FROM employee WHERE deptId=2;SELECT * FROM dept; SELECT * FROM employee;
?
?級聯操作
級聯修改: ON UPDATE CASCADE 級聯刪除: ON DELETE CASCADE?
CREATE TABLE employee(id INT PRIMARY KEY,empName VARCHAR(20),deptId INT,-- 把部門名稱改為部門ID-- 聲明一個外鍵約束CONSTRAINT emlyee_dept_fk FOREIGN KEY(deptId) REFERENCES dept(id) ON UPDATE CASCADE ON DELETE CASCADE -- ON CASCADE UPDATE :級聯修改-- 外鍵名稱 外鍵 參考表(參考字段) ) 注意: 級聯操作必須在外鍵基礎上使用?
-- 級聯修改(修改) -- 直接修改部門 UPDATE dept SET id=5 WHERE id=4;-- 級聯刪除 -- 直接刪除部門 DELETE FROM dept WHERE id=1;?
關聯查詢(多表查詢)
-- **************二、關聯查詢(多表查詢)****************---- -- 需求:查詢員工及其所在部門(顯示員工姓名,部門名稱) -- 2.1 交叉連接查詢(不推薦。產生笛卡爾乘積現象:4 * 4=16,有些是重復記錄) SELECT empName,deptName FROM employee,dept;-- 需求:查詢員工及其所在部門(顯示員工姓名,部門名稱) -- 多表查詢規則:1)確定查詢哪些表 2)確定哪些哪些字段 3)表與表之間連接條件 (規律:連接條件數量是表數量-1) -- 2.2 內連接查詢:只有滿足條件的結果才會顯示(使用最頻繁) SELECT empName,deptName -- 2)確定哪些哪些字段FROM employee,dept -- 1)確定查詢哪些表WHERE employee.deptId=dept.id -- 3)表與表之間連接條件-- 內連接的另一種語法 SELECT empName,deptNameFROM employeeINNER JOIN deptON employee.deptId=dept.id;-- 使用別名 SELECT e.empName,d.deptNameFROM employee eINNER JOIN dept dON e.deptId=d.id;-- 需求: 查詢每個部門的員工 -- 預期結果:-- 軟件開發部 張三-- 軟件開發部 李四-- 應用維護部 王五-- 秘書部 陳六-- 總經辦 null -- 2.2 左[外]連接查詢: 使用左邊表的數據去匹配右邊表的數據,如果符合連接條件的結果則顯示,如果不符合連接條件則顯示null-- (注意: 左外連接:左表的數據一定會完成顯示!) SELECT d.deptName,e.empNameFROM dept dLEFT OUTER JOIN employee eON d.id=e.deptId;-- 2.3 右[外]連接查詢: 使用右邊表的數據去匹配左邊表的數據,如果符合連接條件的結果則顯示,如果不符合連接條件則顯示null-- (注意: 右外連接:右表的數據一定會完成顯示!) SELECT d.deptName,e.empNameFROM employee eRIGHT OUTER JOIN dept dON d.id=e.deptId;-- 2.4 自連接查詢 -- 需求:查詢員工及其上司 -- 預期結果: -- 張三 null-- 李四 張三-- 王五 李四-- 陳六 王五 SELECT e.empName,b.empNameFROM employee e LEFT OUTER JOIN employee bON e.bossId=b.id;?
存儲過程
存儲過程,帶有邏輯的sql語句,存儲過程帶上流程控制語句(if while)?
1)執行效率非常快!存儲過程是在數據庫的服務器端執行的!!! 2)移植性很差!不同數據庫的存儲過程是不能移植。?
存儲過程語法-- 創建存儲過程 DELIMITER $ -- 聲明存儲過程的結束符 CREATE PROCEDURE pro_test() --存儲過程名稱(參數列表) BEGIN -- 開始-- 可以寫多個sql語句; -- sql語句+流程控制SELECT * FROM employee; END $ -- 結束 結束符-- 執行存儲過程 CALL pro_test(); -- CALL 存儲過程名稱(參數); 參數: IN: 表示輸入參數,可以攜帶數據帶存儲過程中 OUT: 表示輸出參數,可以從存儲過程中返回結果 INOUT: 表示輸入輸出參數,既可以輸入功能,也可以輸出功能?
觸發器
例如: 當向員工表插入一條記錄時,希望同時往日志表插入數據-- 需求: 當向員工表插入一條記錄時,希望mysql自動同時往日志表插入數據 -- 創建觸發器(添加) CREATE TRIGGER tri_empAdd AFTER INSERT ON employee FOR EACH ROW -- 當往員工表插入一條記錄時INSERT INTO test_log(content) VALUES('員工表插入了一條記錄');-- 插入數據 INSERT INTO employee(id,empName,deptId) VALUES(7,'扎古斯',1); INSERT INTO employee(id,empName,deptId) VALUES(8,'扎古斯2',1);-- 創建觸發器(修改) CREATE TRIGGER tri_empUpd AFTER UPDATE ON employee FOR EACH ROW -- 當往員工表修改一條記錄時INSERT INTO test_log(content) VALUES('員工表修改了一條記錄');-- 修改UPDATE employee SET empName='eric' WHERE id=7;-- 創建觸發器(刪除) CREATE TRIGGER tri_empDel AFTER DELETE ON employee FOR EACH ROW -- 當往員工表刪除一條記錄時INSERT INTO test_log(content) VALUES('員工表刪除了一條記錄');-- 刪除DELETE FROM employee WHERE id=7;?
mysql權限問題
-- ***********五、mysql權限問題****************-- mysql數據庫權限問題:root :擁有所有權限(可以干任何事情)-- 權限賬戶,只擁有部分權限(CURD)例如,只能操作某個數據庫的某張表-- 如何修改mysql的用戶密碼?-- password: md5加密函數(單向加密)SELECT PASSWORD('root'); -- *81F5E21E35407D884A6CD4A731AEBFB6AF209E1B-- mysql數據庫,用戶配置 : user表 USE mysql;SELECT * FROM USER;-- 修改密碼 UPDATE USER SET PASSWORD=PASSWORD('123456') WHERE USER='root';-- 分配權限賬戶 GRANT SELECT ON day16.employee TO 'eric'@'localhost' IDENTIFIED BY '123456'; GRANT DELETE ON day16.employee TO 'eric'@'localhost' IDENTIFIED BY '123456';?
轉載于:https://www.cnblogs.com/linst/p/5873683.html
總結
- 上一篇: 模拟摇奖:从1-36中随机抽出8个不重复
- 下一篇: docker命令解析