1. 程式人生 > 其它 >MySQL筆記3:外來鍵(瞭解),DML語言

MySQL筆記3:外來鍵(瞭解),DML語言

3. MySQL資料管理

3.1 外來鍵(瞭解,實際上不用

表和表的聯絡。(物理外來鍵,資料庫級別外來鍵,不建議使用,避免資料庫過多造成困擾)

刪除時要先刪除引用別人的表(從表),再刪除被引用的表(主表)

方法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=utf8mb4

-- 學生表的gradeid欄位要引用 年紀表的gradeid
-- 定義外來鍵key
-- 給外來鍵新增約束 (執行引用)
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(3) 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 'email',
    PRIMARY KEY(`id`),
    KEY `FK_gradeid` (`gradeid`),
    CONSTRAINT `FK_gradeid` FOREIGN KEY (`gradeid`) REFERENCES `grade` (`gradeid`)
)ENGINE=INNODB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_bin

方法2

建立表後,新增外來鍵

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=utf8mb4

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(3) 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 'email',
    PRIMARY KEY (`id`)
)ENGINE=INNODB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_bin

-- 建立表時沒有外來鍵關係
-- ALTER TABLE 表名 ADD CONSTRAINT 約束名 FOREIGN KEY(作為外來鍵的列) REFERENCES 表名(引用的欄位);
ALTER TABLE `student` ADD CONSTRAINT `FK_gradeid` FOREIGN KEY(`gradeid`) REFERENCES `grade`(`gradeid`);

期望資料庫

  • 資料庫只作為單純表,只用來存資料,只有行(資料)和列(欄位)
  • 想使用多張表的資料,使用外來鍵(程式實現)

3.2 DML語言(重要

資料庫的意義:資料儲存,管理

DML語言:資料操作語言

  • insert:新增
  • update:修改
  • delete:刪除

3.2.1 新增insert

語法insert into 表名([欄位1,欄位2,欄位3]) values('值1','值2','值3'),('值1','值2','值3')...

注意事項

  1. 欄位間使用英文逗號隔開
  2. 欄位可以省略,但後面的值要按順序一一對應,不能缺少亂序
  3. 可以同時插入多條資料,values後的值需要使用,隔開,values('值1'),('值2')...
-- 插入語句(新增)
-- insert into 表名([欄位1,欄位2,欄位3]) values('值1','值2','值3'),('值1','值2','值3')...
INSERT INTO `grade`(`gradename`) VALUES('四')

-- 由於主鍵自增,可以省略主鍵。如果不寫表的欄位,會一一匹配
INSERT INTO `grade` VALUE ('三')

-- 寫插入語句,要資料和欄位一一對應
-- 插入多個欄位
INSERT INTO `grade` (`gradename`) VALUE ('二'),('一')

INSERT INTO `student`(`name`) VALUE ('A1')
INSERT INTO `student`(`name`,`pwd`,`sex`) VALUE ('T1','123890','women')
INSERT INTO `student`(`name`,`pwd`,`sex`) VALUE ('B1','123001','women'),('B2','123000','men')

3.2.2 修改 update

修改目標,set 列名 = 新值

語法UPDATE 表名 SET 列 = 新值,[列 = 新值] WHERE [條件]

條件:where子句 運算子,可以通過多個條件定位資料

操作符 含義 範圍 結果
= 等於 5=6 false
<> 或 != 不等於 5<>6 true
> 大於
< 小於
>= 大於等於
<= 小於等於
between .. and ... 在某個範圍內(包含兩端) [2,5]
and 和,&&
or 或,||

注意:

  1. 列(colnum_name)儘量帶上``
  2. 條件,篩選的條件,如果沒有指定,則會修改所有的列
  3. value是一個具體的值,也可以是變數,如CURRENT_TIME
  4. 多個設定的屬性之間,使用英文逗號隔開
-- UPDATE 表名 SET 列 = 新值,[列 = 新值] WHERE [條件]

-- 修改名字,包含條件
UPDATE `student` SET `name` = 'Aupdate' WHERE id = 1;

-- 不指定條件的情況下,會改動所有的表
UPDATE `student` SET `name` = 'Aupdate'

-- 修改多個屬性,逗號隔開
UPDATE `student` SET `name` = 'Aupdate',`email` = '[email protected]' WHERE id = 1

3.2.3 刪除

delete命令

語法delete from 表名 [where 條件]

-- 刪除資料。避免這樣寫,會全部刪除
DELETE FROM `student` 

-- 刪除指定資料
DELETE FROM `student` WHERE id = 1

TRUNCATE命令

作用:完全清空一個數據庫,表的結構和索引約束不變

-- 清空表
TRUNCATE `student`

區別

  • 相同點:都能刪除資料,都不會刪除表結構
  • 不同點:
    • TRUNCATE:重新設定自增列,計數器歸零
    • TRUNCATE:不會影響事務
  • delete刪除時,重啟資料庫後(瞭解)
    • InnoDB:自增列會從1開始(存在記憶體中,斷電即失)
    • MyISAM:繼續上一個自增量開始(存在檔案中,不會丟失)