MySQL學習03(MySQL數據管理)

MySQL數據管理

外鍵

外鍵概念

若是公共關鍵字在一個關係中是主關鍵字,那麼這個公共關鍵字被稱爲另外一個關係的外鍵。因而可知,外鍵表示了兩個關係之間的相關聯繫。以另外一個關係的外鍵做主關鍵字的表被稱爲主表,具備此外鍵的表被稱爲主表的從表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;

DML語言

數據庫意義 : 數據存儲、數據管理日誌

管理數據庫數據方法:code

  • 經過SQLyog等管理工具管理數據庫數據
  • 經過DML語句管理數據庫數據

DML語言 : 數據操做語言對象

  • 用於操做數據庫對象中所包含的數據
  • 包括 :
    • INSERT (添加數據語句)
    • UPDATE (更新數據語句)
    • DELETE (刪除數據語句)

添加數據

INSERT命令

語法:blog

INSERT INTO 表名[(字段1,字段2,字段3,...)] VALUES('值1','值2','值3')

注意:

  • 字段或值之間用英文逗號隔開 。
  • ' 字段1,字段2...' 該部分可省略 , 但添加的值務必與表結構,數據列,順序相對應,且數量一致。
  • 可同時插入多條數據 , values 後用英文逗號隔開。
-- 語法 : 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命令

語法:

UPDATE 表名 SET column_name=value [,column_name2=value2,...] [WHERE condition];

注意 :

  • column_name 爲要更改的數據列
  • value 爲修改後的數據 , 能夠爲變量 , 具體指 , 表達式或者嵌套的SELECT結果
  • condition 爲篩選條件 , 如不指定則修改該表的全部列數據

where條件子句

能夠簡單的理解爲 : 有條件地從表中篩選數據

運算符 含義 例子 結果
= 等於 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命令

語法:

DELETE FROM 表名 [WHERE condition];

注意:condition爲篩選條件 , 如不指定則刪除該表的全部列數據

-- 刪除最後一個數據
DELETE FROM grade WHERE gradeid = 5

TRUNCAT命令

做用:用於徹底清空表數據 , 但表結構 , 索引 , 約束等不變 ;

語法:

TRUNCATE [TABLE] table_name;

-- 清空年級表
TRUNCATE grade

注意:區別於DELETE命令

  • 相同 : 都能刪除數據 , 不刪除表結構 , 但TRUNCATE速度更快

  • 不一樣 :

    • 使用TRUNCATE TABLE 從新設置AUTO_INCREMENT計數器
    • 使用TRUNCATE TABLE不會對事務有影響 (事務後面會說)
-- 建立一個測試表
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 : 自增列依然從上一個自增數據基礎上開始 (存在文件中,不會丟失)
相關文章
相關標籤/搜索