MySQL資料庫—DML資料管理(三)
阿新 • • 發佈:2020-02-03
MySQL資料管理
1、外來鍵
方式一、在建立表的時候,增加約束 (麻煩,比較複雜)
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 -- 定義外來鍵key -- 給這個外來鍵新增約束 (執行引用) references 引用 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 '密碼',`sex` 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
刪除有外來鍵關係的表的時候,必須要先刪除引用別人的表 (從表),再刪除被引用的表 (主表)
方式二 : 建立表成功後,新增外來鍵約束
CREATE TABLE `grade`( `gradeid` INT(10) NOT NULL AUTO_INCREMENT COMMENT '年級id',PRIMARY KEY (`gradeid`) )ENGINE=INNODB DEFAULT CHARSET=utf8 -- 學生表的 gradeid 欄位 要去引用年級表的 gradeid -- 定義外來鍵key -- 給這個外來鍵新增約束 (執行引用) references 引用 CREATE TABLE IF NOT EXISTS `student` ( `id` INT(4) NOT NULL AUTO_INCREMENT COMMENT '學號',PRIMARY KEY(`id`) )ENGINE=INNODB DEFAULT CHARSET=utf8 -- 建立表的時候沒有外來鍵關係 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
3.3、新增
insert
-- 插入語句(新增) -- insert into 表名([欄位名1,欄位2,欄位3])values('值1'),('值2'),('值3',....) INSERT INTO `grade`(`gradename`) VALUES('大四') -- 由於主鍵自增我們可以省略 (如果不寫表的欄位,他就會一一匹配) INSERT INTO `grade` VALUES('大三') -- 一般寫插入語句,我們一定要資料和欄位一一對應! -- 插入多個欄位 INSERT INTO `grade`(`gradename`) VALUES('大二'),('大一') INSERT INTO `student`(`name`) VALUES ('張三') INSERT INTO `student`(`name`,`pwd`,`sex`) VALUES ('張三','aaaaaa','男') INSERT INTO `student`(`name`,`sex`) VALUES ('李四','男'),('王五','男')
語法:insert into 表名([欄位名1,('值3',....)
注意事項:
- 欄位和欄位之間使用 英文逗號 隔開
- 欄位是可以省略的,但是後面的值必須要要一一對應,不能少
- 可以同時插入多條資料,VALUES 後面的值,需要使用,隔開即可
VALUES(),(),....
4、修改
update 修改誰 (條件) set 原來的值 = 新值
-- 修改學員名字,帶了簡介
UPDATE `student` SET `name`='狂神' WHERE id = 1;
-- 不指定條件的情況下,會改動所有表!
UPDATE `student` SET `name`='長江7號'
-- 修改多個屬性,逗號隔開
UPDATE `student` SET `name`='狂神',`email`='[email protected]' WHERE id = 1;
-- 語法:
-- UPDATE 表名 set colnum_name = value,[colnum_name = value,....] where [條件]
條件:where 子句 運算子 id 等於某個值,大於某個值,在某個區間內修改….
操作符會返回 布林值
操作符 | 含義 | 範圍 | 結果 |
---|---|---|---|
= | 等於 | 5=6 | false |
<> 或 != | 不等於 | 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`='長江7號' WHERE `name`='狂神44' AND sex='女'
語法:UPDATE 表名 set colnum_name = value,....] where [條件]
注意:
- colnum_name 是資料庫的列,儘量帶上``
- 條件,篩選的條件,如果沒有指定,則會修改所有的列
- value,是一個具體的值,也可以是一個變數
- 多個設定的屬性之間,使用英文逗號隔開
UPDATE `student` SET `birthday`= CURRENT_TIME WHERE `name`='長江7號' AND sex='女'
5、刪除
delete 命令
語法: delete from 表名 [where 條件]
-- 刪除資料 (避免這樣寫,會全部刪除)
DELETE FROM `student`
-- 刪除指定資料
DELETE FROM `student`WHERE id = 1;
TRUNCATE 命令
作用:完全清空一個數據庫表,表的結構和索引約束不會變!
-- 清空 student 表
TRUNCATE `student`
delete 的 TRUNCATE 區別
- 相同點:都能刪除資料,都不會刪除表結構
- 不同:
- TRUNCATE 重新設定 自增列 計數器會歸零
- TRUNCATE 不會影響事務
-- 測試delete 和 TRUNCATE 區別
CREATE TABLE `test`(
`id` INT(4) NOT NULL AUTO_INCREMENT,`coll` VARCHAR(20) NOT NULL,PRIMARY KEY (`id`)
)ENGINE=INNODB DEFAULT CHARSET=utf8
INSERT INTO `test`(`coll`) VALUES('1'),('2'),('3')
DELETE FROM `test` -- 不會影響自增
TRUNCATE TABLE `test` -- 自增會歸零
瞭解即可:DELETE刪除的問題
,重啟資料庫,現象
- InnoDB 自增列會重1開始 (存在記憶體當中的,斷電即失)
- MyISAM 繼續從上一個自增量開始 (存在檔案中的,不會丟失)