Mysql:MySQL資料管理
外鍵管理
外鍵概念
如果公共關鍵字在一個關系中是主關鍵字,那么這個公共關鍵字被稱為另一個關系的外鍵,由此可見,外鍵表示了兩個關系之間的相關聯系,以另一個關系的外鍵作主關鍵字的表被稱為主表,具有此外鍵的表被稱為主表的從表,
在實際操作中,將一個表的值放入第二個表來表示關聯,所使用的值是第一個表的主鍵值(在必要時可包括復合主鍵值),此時,第二個表中保存這些值的屬性稱為外鍵(foreign key),
外鍵作用
保持資料一致性,完整性,主要目的是控制存盤在外鍵表中的資料,約束, 使兩張表形成關聯,外鍵只能參考外表中的列的值或使用空值,
創建外鍵
-
建表時指定外鍵約束
-
[
](javascript:void(0)??# 創建外鍵的方式一 : 創建子表同時創建外鍵 # 年級表(id\年級名稱) 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 # 學生資訊表 #(學號,姓名,性別,年級,手機,地址,出生日期,郵箱,身份證號) CREATE TABLE `student` ( `studentno` INT(4) NOT NULL COMMENT '學號', `studentname` VARCHAR(20) NOT NULL DEFAULT '匿名' COMMENT '姓名', `sex` TINYINT(1) DEFAULT '1' COMMENT '性別', `gradeid` INT(10) DEFAULT NULL COMMENT '年級', `phoneNum` VARCHAR(50) NOT NULL COMMENT '手機', `address` VARCHAR(255) DEFAULT NULL COMMENT '地址', `borndate` DATETIME DEFAULT NULL COMMENT '生日', `email` VARCHAR(50) DEFAULT NULL COMMENT '郵箱', `idCard` VARCHAR(18) DEFAULT NULL COMMENT '身份證號', PRIMARY KEY (`studentno`), KEY `FK_gradeid` (`gradeid`), CONSTRAINT `FK_gradeid` FOREIGN KEY (`gradeid`) REFERENCES `grade` (`gradeid`) ) ENGINE=INNODB DEFAULT CHARSET=utf8[
](javascript:void(0)?? -
建表后修改
-
# 創建外鍵方式二 : 創建子表完畢后,修改子表添加外鍵 ALTER TABLE student ADD CONSTRAINT `FK_gradeid` FOREIGN KEY (`gradeid`) REFERENCES `grade` (`gradeid`);
洗掉外鍵
注意 : 洗掉具有主外鍵關系的表時 , 要先刪子表 , 后刪主表
# 洗掉外鍵
ALTER TABLE student DROP FOREIGN KEY FK_gradeid;
# 發現執行完上面的,索引還在,所以還要洗掉索引
# 注:這個索引是建立外鍵的時候默認生成的
ALTER TABLE student DROP INDEX FK_gradeid;
資料庫資料管理
資料庫意義
- 資料存盤
- 資料管理
管理資料庫資料方法
- 通過SQLyog等管理工具管理資料庫資料
- 通過DML陳述句管理資料庫資料
DML語言
- DML(資料操作語言)
- 用于操作資料庫物件中所包含的資料
- 包括 :
- INSERT (添加資料陳述句)
- UPDATE (更新資料陳述句)
- DELETE (洗掉資料陳述句)
添加資料
INSERT命令
-
語法 :
INSERT INTO 表名[(欄位1,欄位2,欄位3,...)] VALUES('值1','值2','值3')
注意 :
- 欄位或值之間用英文逗號隔開.
- '欄位1,欄位2...'該部分可省略 , 但添加的值務必與表結構,資料列,順序相對應,且數量一致.
- 可同時插入多條資料 , values 后用英文逗號隔開.
[
](javascript:void(0)??
# 使用陳述句如何增加陳述句?
# 語法 : INSERT INTO 表名[(欄位1,欄位2,欄位3,...)] VALUES('值1','值2','值3')
INSERT INTO grade(gradename) VALUES ('大一');
# 主鍵自增,那能否省略呢?
INSERT INTO grade VALUES ('大二');
# 查詢:INSERT INTO grade VALUE ('大二')錯誤代碼: 1136
# Column count doesn`t match value count at row 1
# 得出結論:'欄位1,欄位2...'該部分可省略 , 但添加的值務必與表結構,資料列,順序相對應,且數量一致.
# 一次插入多條資料
INSERT INTO grade(gradename) VALUES ('大三'),('大四');
[
](javascript:void(0)??
練習題目
自己使用INSERT陳述句為課程表subject添加資料 . 使用到外鍵.
修改資料
UPDATE命令
-
語法 :
UPDATE 表名 SET column_name=value [,column_name2=value2,...] [WHERE condition];
注意 :
- column_name 為要更改的資料列
- value 為修改后的資料 , 可以為變數 , 具體指 , 運算式或者嵌套的SELECT結果
- condition 為篩選條件 , 如不指定則修改該表的所有列資料
WHERE條件子句
可以簡單的理解為 : 有條件地從表中篩選資料

洗掉資料
DELETE命令
- 語法
DELETE FROM 表名 [WHERE condition];
注意 : condition為篩選條件 , 如不指定則洗掉該表的所有列資料
TRUNCATE命令
- 用于完全清空表資料 , 但表結構 , 索引 , 約束等不變 ;
- 語法 : TRUNCATE [TABLE] table_name;
注意 : 區別于DELETE命令
-
相同 : 都能洗掉資料 , 不洗掉表結構 , 但TRUNCATE速度更快
-
不同 :
- 使用TRUNCATE TABLE 重新設定AUTO_INCREMENT計數器
- 使用TRUNCATE TABLE不會對事務有影響
-
[
](javascript:void(0)??# 創建一個測驗表 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('row1'),('row2'),('row3'); # 洗掉表資料(不帶where條件的delete) DELETE FROM test; # 結論:如不指定Where則洗掉該表的所有列資料,自增當前值依然從原來基礎上進行,會記錄日志. # 洗掉表資料(truncate) TRUNCATE TABLE test; # 結論:truncate洗掉資料,自增當前值會恢復到初始值重新開始;不會記錄日志. # 同樣使用DELETE清空不同引擎的資料庫表資料.重啟資料庫服務后 # InnoDB : 自增列從初始值重新開始 (因為是存盤在記憶體中,斷電即失) # MyISAM : 自增列依然從上一個自增資料基礎上開始 (存在檔案中,不會丟失)[
](javascript:void(0)??
轉載請註明出處,本文鏈接:https://www.uj5u.com/shujuku/78574.html
標籤:MySQL
