1. 程式人生 > 資料庫 >MySQL資料庫—DML資料管理(三)

MySQL資料庫—DML資料管理(三)

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',....)

注意事項:

  1. 欄位和欄位之間使用 英文逗號 隔開
  2. 欄位是可以省略的,但是後面的值必須要要一一對應,不能少
  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 繼續從上一個自增量開始 (存在檔案中的,不會丟失)