MySQL 數據管理DML語言
1 外鍵(瞭解即可)
流程圖描述:
MySQL代碼測試:
(首先將數據庫中表清空,隨後輸入以下操作,要嚴格按照語句輸入,不然會報錯)
方式一、在創建表的時候,增加約束(比較麻煩,也比較複雜)
-- 定義年級表:
CREATE TABLE `grade`(
`gradeid` INT(10) NOT NULL AUTO_INCREMENT COMMENT '年級id',
`gradename` VARCHAR(50) NOT NULL COMMENT '年級名稱',
PRIMARY KEY(`gradeid`)
)ENGINE=INNODB DEFAULT CHARSET=utf8
-- 定義學生表:
-- 學生表的gradeid字段需要引用年級表的gradeid
-- 1.定義外鍵KEY
-- 2.給這個外鍵添加約束(執行引用)
CREATE TABLE IF NOT EXISTS `student`(
`id` INT(4) NOT NULL AUTO_INCREMENT COMMENT '學號',
`name` VARCHAR(30) NOT NULL DEFAULT '匿名' COMMENT '姓名',
`pwd` VARCHAR(20) NOT NULL DEFAULT '123456' COMMENT '密碼',
`gender` VARCHAR(2) NOT NULL DEFAULT '女' COMMENT '性別',
`birthday` DATETIME DEFAULT NULL COMMENT '出生日期',
`gradeid` INT(10) NOT NULL COMMENT '學生的年級',
`address` VARCHAR(100) DEFAULT NULL COMMENT '家庭住址',
`email` VARCHAR(50) DEFAULT NULL COMMENT '郵箱',
PRIMARY KEY(`id`),
KEY `FK_gradeid`(`gradeid`), -- 定義外鍵
CONSTRAINT `FK_gradeid` FOREIGN KEY(`gradeid`) REFERENCES `grade`(`gradeid`) -- 添加約束
)ENGINE=INNODB DEFAULT CHARSET=utf8
說明:上述代碼核心是:
KEY `FK_gradeid`(`gradeid`), -- 定義外鍵
CONSTRAINT `FK_gradeid` FOREIGN KEY(`gradeid`) REFERENCES `grade`(`gradeid`) -- 添加約束
運行成功後查看外鍵:
刪除有外鍵關係的表的時候,必須先刪除引用別人的表(從表),再刪除被引用的表(主表)
方式二、創建普通的表成功後,添加外鍵約束
-- 創建表的時候沒有外鍵關係
ALTER TABLE `student`
ADD CONSTRAINT `FK_gradeid` FOREIGN KEY (`gradeid`) REFERENCES `grade`(`gradeid`);
-- ALTER TABLE 表名 ADD CONSTRAINT 約束名 FOREIGN KEY(作爲外鍵的列) REFERENCES 主表(被引用字段);
成功執行~
以上的操作都是物理外鍵,數據庫級別的外鍵,不建議使用!(避免數據庫過多造成困擾)
最佳實踐:
- 數據庫就是單純的表,只用來存數據,只有行(數據)和列(數據)
- 如果想使用多張表的數據,使用外鍵(程序使用)
2 DML語言(全部記住)
數據庫存在意義:數據存儲和數據管理
DML語言:數據操作語言
- INSERT 插入
- UPDATE 修改
- DELETE 刪除
2.1 添加(INSERT)
(說明:以下代碼執行環境爲兩個表:grade+student,且無外鍵!)
代碼測試:
-- 如果不寫表的字段,插入語句就會一一匹配,所以寫插入語句,必須保證數據與字段一一對應!
-- 向年級表中插入數據
INSERT INTO `grade`(`gradename`) VALUES('大一')
-- 插入多個字段
INSERT INTO `grade`(`gradename`)
VALUES('大二'),('大三'),('大四');
-- 向學生表中插入數據
INSERT INTO `student` (`name`,`pwd`,`gender`,`gradeid`) VALUES ('張三','aaaaaa','男',4);
-- 插入多個字段
INSERT INTO `student` (`name`,`pwd`,`gender`,`gradeid`)
VALUES ('王五','111111','男',3),('張三','aaaaaa','男',2),('李四','bbbbbb','男',1);
語法:INSERT INTO 表名([字段名1][字段2][字段3]...) VALUES('值1','值2','值3',...);
注意事項:
- 字段和字段之間必須使用 英文逗號 隔開
- 字段可以省略,但是後面的數值必須與字段一一對應
- 可以同時插入多條數據,VALUES後面的值需要使用
VALUES(),(),...
2.2 修改(UPDATE)
代碼測試:
-- 修改學生姓名、郵箱
UPDATE `student` SET `name`='Demut',`email` = '[email protected]' WHERE id = 1;
-- 不指定條件的情況下,默認全部更改!
-- 注意:以下語句謹慎執行!
UPDATE `student` SET `name` = '長江七號';
運行結果:
語法:
UPDATE 表名 SET column_name = value,[column_name = value],... WHERE [條件]
條件:WHERE字句運算符 id等於/大於/某一區間
操作符返回布爾值。
操作符 | 含義 | 範圍 | 結果 |
---|---|---|---|
= | 等於 | 5=6 | false |
<>或!= | 不等於 | 5<>6 | true |
> | 大於 | 5>6 | false |
< | 小於 | 5<6 | true |
>= | 大於等於 | 5>=6 | true |
<= | 小於等於 | 5<=6 | true |
BETWEEN … AND … | 閉區間 | [2, 5] | |
AND | 我和你&& | 5>1 AND 1<2 | false |
OR | 我或你|| | 5>1 OR 1<2 | true |
-- 通過多個條件定位數據
UPDATE `student` SET `name`='長江七號' WHERE `name` = '張三' AND `gender` = '男';
注意:
- column_name 是數據庫的列,儘量帶上``
- 條件:篩選的條件,如果沒有指定,則會修改所有的列
- value,是一個具體的值,也可以是一個變量
- 多個設置的屬性之間使用英文逗號隔開
2.3 刪除(DELETE)
DELETE命令
語法:DELETE FROM 表名 [WHERE 條件]
-- 刪除指定數據數據
DELETE FROM `student` WHERE id=2;
-- 刪除數據 (注意,以下代碼謹慎執行,會全部刪掉!)
DELETE FROM `student`
運行結果:
TRUNCATE 命令~刪庫跑路
作用:完全清空一個數據庫表,表的結構和索引約束不會變!
-- 清空student表
TRUNCATE `student`
DELETE的TRUNCATE區別:
-
相同點:都能刪除數據,都不會刪除表結構
-
不同點:
- TRUNCATE 重新設置自增列,計數器會歸零
- TRUNCATE 不會影響事務
-
以下代碼可自行測試:
-- 測試DELETE和TRUNCATE區別 CREATE TABLE `test`( `id` INT(4) NOT NULL AUTO_INCREMENT, `name` VARCHAR(20) NOT NULL, PRIMARY KEY(`id`) )ENGINE=INNODB DEFAULT CHARSET=utf8 INSERT INTO `test`(`name`) VALUES('1'),('2'),('3') DELETE FROM `test` -- 不會影響自增 TRUNCATE TABLE `test` -- 自增會歸零
補充說明:DELETE刪除的問題
,重啓數據庫,現象
- InnoDB 自增列會從1開始(存在內存中,斷電即失)
- MyISAM 繼續從上一個自增量開始(存在文件中,不會丟失)
寫在最後
Instead, speaking the truth in love, we will grow to become in every respect the mature body of him who is the head, that is, Christ. (Ephesians 4:15)
To Demut!