若是公共關鍵字在一個關係中是主關鍵字,那麼這個公共關鍵字被稱爲另外一個關係的外鍵。因而可知,外鍵表示了兩個關係之間的相關聯繫。以另外一個關係的外鍵做主關鍵字的表被稱爲主表,具備此外鍵的表被稱爲主表的從表。mysql
在實際操做中,將一個表的值放入第二個表來表示關聯,所使用的值是第一個表的主鍵值(在必要時可包括複合主鍵值)。此時,第二個表中保存這些值的屬性稱爲外鍵(foreign key)。sql
外鍵做用:保持數據一致性,完整性,主要目的是控制存儲在外鍵表中的數據,約束。 使兩張表造成關聯,外鍵只能引用外表中的列的值或使用空值。數據庫
建表時指定外鍵約束工具
-- 建立外鍵的方式一 : 建立子表同時建立外鍵 -- 年級表 (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
建表後修改測試
-- 建立外鍵方式二 : 建立子表完畢後,修改子表添加外鍵 ALTER TABLE `student` ADD CONSTRAINT `FK_gradeid` FOREIGN KEY (`gradeid`) REFERENCES `grade` (`gradeid`);
注意 : 刪除具備主外鍵關係的表時 , 要先刪子表 , 後刪主表,否則出現下面這樣的報錯
3d
-- 刪除外鍵 ALTER TABLE student DROP FOREIGN KEY FK_gradeid; -- 發現執行完上面的,索引還在,因此還要刪除索引 -- 注:這個索引是創建外鍵的時候默認生成的 ALTER TABLE student DROP INDEX FK_gradeid;
數據庫意義 : 數據存儲、數據管理日誌
管理數據庫數據方法:code
DML語言 : 數據操做語言對象
語法:blog
INSERT INTO 表名[(字段1,字段2,字段3,...)] VALUES('值1','值2','值3')
注意:
-- 語法 : 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 ('大三'),('大四');
語法:
UPDATE 表名 SET column_name=value [,column_name2=value2,...] [WHERE condition];
注意 :
能夠簡單的理解爲 : 有條件地從表中篩選數據
運算符 | 含義 | 例子 | 結果 |
---|---|---|---|
= | 等於 | 1=2 | false |
<> 或 != | 不等於 | 1!=2 | true |
> | 大於 | 1>2 | false |
< | 小於 | 1<2 | true |
>= | 大於等於 | 2>=3 | false |
<= | 小於等於 | 2<=3 | true |
BETWEEN | 在某個範圍之間 | BETWEEN 5 AND 10 | |
AND | 而且 | 2>1 AND 1<2 | true |
OR | 或 | 1>2 OR 2>3 | true |
-- 修改年級信息 UPDATE grade SET gradename = '高中' WHERE gradeid = 1;
語法:
DELETE FROM 表名 [WHERE condition];
注意:condition爲篩選條件 , 如不指定則刪除該表的全部列數據
-- 刪除最後一個數據 DELETE FROM grade WHERE gradeid = 5
做用:用於徹底清空表數據 , 但表結構 , 索引 , 約束等不變 ;
語法:
TRUNCATE [TABLE] table_name; -- 清空年級表 TRUNCATE grade
注意:區別於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('row1'),('row2'),('row3'); -- 刪除表數據(不帶where條件的delete) DELETE FROM test; -- 結論:如不指定Where則刪除該表的全部列數據,自增當前值依然從原來基礎上進行,會記錄日誌. -- 刪除表數據(truncate) TRUNCATE TABLE test; -- 結論:truncate刪除數據,自增當前值會恢復到初始值從新開始;不會記錄日誌. -- 一樣使用DELETE清空不一樣引擎的數據庫表數據.重啓數據庫服務後 -- InnoDB : 自增列從初始值從新開始 (由於是存儲在內存中,斷電即失) -- MyISAM : 自增列依然從上一個自增數據基礎上開始 (存在文件中,不會丟失)