第四章 數據表的基本操作

數據表的基本操作


一、創建數據表

1、創建表的語法形式

數據表屬於數據庫,在創建數據表之前,先使用USE <DataBaseName>指定操作是在哪個數據庫內進行的,如果沒有進行選擇,將會拋出No database selected的錯誤。

創建數據表的語句爲CREATE TABLE,語法規則如下:

CREATE TABLE <TableName>(
	字段1	數據類型 [列級別約束] [默認值],
	字段2	數據類型 [列級別約束] [默認值],
	......,
	[表級別約束]

注意:
1、表名稱不區分大小寫,不可使用SQL語言中的關鍵字
2、數據表中每一列(字段)的名稱和數據類型若創建多列,就要用逗號隔開

示例:

CREATE TABLE tb_emp1(
	id		INT(11),		//員工編號
	name	VARCHAR(25),	//員工姓名
	deptId	INT(11),		//所在部門編號
	salary	FLOAT			//工資
);

2、使用主鍵約束

主鍵,又稱主碼,是表中一列或多列的組合,主鍵約束要求主鍵列的數據唯一,並且不允許爲空。

主鍵分爲兩種類型:

主鍵的類型
單字段主鍵
多字段聯合主鍵

2.1、單字段主鍵

主鍵由一個字段組成

SQL語句分爲兩種情況:

(1)在定義列的同時指定主鍵

CREATE TABLE tb_emp2(
	id		INT(11)		PRIMARY	KEY,
	name	VARCHAR(25),
	deptId	INT(11),
	salary	FLOAT
);

(2)在定義完所有列之後指定主鍵

CREATE TABLE tb_emp3(
	id		INT(11),
	name	VARCHAR(25),
	deptId	INT(11),
	salary	FLOAT,
	PRIMARY	KEY(id)
);

2.2、多字段主鍵

主鍵由多個字段聯合組成

語法規則如下:

PRIMARY	KEY	(字段1, 字段2, 字段3, ..., 字段n)

示例演示:

CREATE TABLE tb_emp4(
	name	VARCHAR(25),
	deptId	INT(11),
	salary	FLOAT,
	PRIMARY	KEY(name, deptId)
);

3、使用外鍵約束

1、外鍵用來在兩個表的數據之間建立連接,可以是一列或者多列
2、一個表可以有一個或多個外鍵
3、外鍵對應的是參照完整性,一個表的外鍵可以爲空值,若不爲空值,則每一個外鍵值必須等於另一個表中的主鍵的某個值

外鍵:它是表中的一個字段,可以不是本表的主鍵,但要對應另外一個表的主鍵

作用:外鍵的主要作用是保證數據的引用完整性(參照完整性)

主表(父表):相關聯字段中主鍵所在的那個表

從表(子表):相關聯字段中外鍵所在的那個表

語法規則如下:

CONSTRAINT 外鍵名	FOREIGN	KEY	(字段名1, 字段名2, ..., 字段名n)	REFERENCES 主表名(主鍵列1,, 主鍵列2, ..., 主鍵列n)

外鍵名:定義的外鍵約束的名稱
一個表中,不能有相同名稱的外鍵

示例演示:

CREATE	TABLE	tb_dept1(
	id			INT(11)		PRIMARY	KEY,	//部門編號
	name		VARCHAR(22)	NOT	NULL,		//部門名稱
	location	VARCHAR(50)					//部門位置
);

CREATE	TABLE	tb_emp5(
	id		INT(11)	PRIMARY	KEY,
	name	VARCHAR(25),
	deptId	INT(11),
	salary	FLOAT,
	CONSTRAINT fk_emp5_dept1 FOREIGN KEY(deptId) REFERENCES tb_dept1(id)
);

注意:
子表的外鍵必須關聯父表的主鍵且關聯字段的數據類型必須匹配,若不匹配,則拋出ERROR 3780 (HY000): Referencing column 'deptId' and referenced column 'id' in foreign key constraint 'fk_emp5_dept1' are incompatible.


4、使用非空約束

非空約束指字段的值不能爲空

語法規則如下:

字段名	數據類型	NOT	NULL

示例演示:(指定員工的姓名不能爲空)

CREATE TABLE tb_emp6(
	id		INT(11)	PRIMARY	KEY,
	name	VARCHAR(25) NOT NULL,
	deptId	INT(11),
	salary	FLOAT
);

5、使用唯一性約束

唯一性約束要求該列唯一,允許爲空,但只能出現一個空值
唯一約束可以保證一列或幾列不出現重複值

5.1、在定義完列之後直接指定唯一約束

語法規則如下:

字段名	數據類型	UNIQUE

示例演示:

CREATE TABLE tb_dept2(
	id			INT(11)	PRIMARY KEY,
	name		VARCHAR(22) UNIQUE,
	location	VARCHAR(50)
);

5.2、在定義完所有列之後指定唯一約束

語法規則如下:

CONSTRAINT	約束名	UNIQUE(字段名)

示例演示:

CREATE TABLE tb_dept3(
	id			INT(11) PRIMARY KEY,
	name		VARCHAR(22),
	location	VARCHAR(50),
	CONSTRAINT STH UNIQUE(name)
);

UNIQUE與PRIMARY KEY的區別:
1、一張表中可以有多個字段聲明爲UNIQUE,但只能有一個PRIMARY KEY聲明
2、聲明爲PRIMARY KEY 的列不允許有空值,但是聲明爲UNIQUE的字段允許空值的存在


6、使用默認約束

默認約束指定某列的默認值

語法規則如下:

字段名	數據類型	DEFAULT 默認值

實例演示:

CREATE TABLE tb_emp7(
	id		INT(11) PRIMARY KEY,
	name	VARCHAR(25) NOT NULL,
	deptId	INT(11) DEFAULT 1111,
	salary	FLOAT
);

7、設置表的屬性值自動增加

1、在MySQL中AUTO_INCREMENT的初始值默認爲1
2、一個表只能有一個字段使用AUTO_INCREMENT約束,且該字段必須爲主鍵的一部分
3、AUTO_INCREMENT約束的字段可以是任何正整數類型,如(TINYINT,SMALLINT,INT,BIGINT等)

語法規則如下:

CREATE TABLE tb_emp8(
	id		INT(11) PRIMARY KEY AUTO_INCREMENT,
	name	VARCHAR(25) NOT NULL,
	deptId	INT(11),
	salary	FLOAT
);

執行如下插入語句:

INSERT INTO tb_emp8 (name,salary) VALUES ('Lucy',1000), ('Lura',1200), ('Kevin',1500);

結果如下:(可以觀察到主鍵id的值是從1以1爲步長增加的)

插入測試


二、查看數據表結構

  在MySQL中,使用SQL語句創建數據表之後,爲了查看數據表的結構定義以確認是否正確,可以使用DESCRIBESHOW CREATE TABLE語句

1、查看錶基本結構語句DESCRIBE

DESCRIBE可以查看錶的字段信息(字段名,數據類型,是否爲主鍵,是否有默認值等)

語法規則如下:

DESCRIBE	表名
	或者
DESC	表名

示例演示:

DESCRIBE tb_dept1;

結果如下:
結果演示

實例演示:

DESC tb_emp1;

結果如下:
結果演示

字段解釋:
1、NULL:表示該列是否可以爲NULL
2、KEY:表示該列是否已編制索引,其中,PRI表示該列是主鍵的一部分,UNI表示該列是UNIQUE索引的一部分,MUL表示列中某個給定值允許出現多次
3、DEFAULT:表示改了是否有默認值,有的話顯示指定值是多少
4、Extra:表示可以獲取的與給定列有關的附加信息,如AUTO_INCREMENT




2、查看錶詳細結構語句SHOW CREATE TABLE

可以用來顯示創建表時的SQL語句,查看存儲引擎字符編碼

語法格式如下:

SHOW CREATE TABLE 表名\G

注意:如果不加\G參數,顯示的結果將非常混亂

示例演示:

SHOW CREATE TABLE tb_emp1\G

結果如下:
結果演示


三、修改數據表

  修改數據庫中已經存在的數據表的結構
  MySQL使用ALTER TABLE語句修改表
  常見操作:修改表名修改字段數據類型修改字段名增加字段刪除字段修改字段排列位置更改表的存儲引擎刪除表得到外鍵約束

1、修改表名

MySQL通過ALTER TABLE語句來修改數據表。

語法規則如下:

ALTER TABLE 舊錶名 RENAME [TO] 新表名

示例演示:

將表 tb_dept3 改名爲 tb_department3
ALTER TABLE tb_dept3 RENAME tb_department3;

修改表名並不修改表的結構


2、修改字段的數據類型

語法規則如下:

ALTER TABLE 表名 MODIFY 字段名 數據類型

“表名”指要修改數據類型的字段所在的表
“字段名”指要修改的字段
“數據類型”指修改後的新數據類型

實例演示:

DESC tb_dept1;
ALTER TABLE tb_dept1 MODIFY name VARCHAR(30);
DESC tb_dept1;

結果如下:
結果演示

3、修改字段名

語法規則如下:

ALTER TABLE 表名 CHANGE 舊字段名 新字段名 新數據類型

“表名”指要修改的字段所在的表
“舊字段名”指修改前的字段名
“新字段名”指修改後的字段名
“新數據類型”指修改後的數據類型(如果不需要修改字段的數據類型,將新數據類型設置爲原來的數據類型即可,千萬不可以爲空)

示例演示:

將數據表 tb_dept1 中的 location 字段名稱次改爲 loc 且數據類型不變
DESC tb_dept1;
ALTER TABLE tb_dept1 CHANGE location loc VARCHAR(50);
DESC tb_dept1;

結果如下:
結果展示

示例演示:

將數據表 tb_dept1 中的 loc 字段名稱改爲 location 同時將數據類型修改爲VARCHAR(60)

DESC tb_dept1;
ALTER TABLE tb_dept1 CHANGE loc location VARCHAR(60);
DESC tb_dept1;

結果如下:
結果展示

注意:
  CHANGE也可以值修改數據類型,實現和MODIFY同樣的效果,方法是將“新字段名”和“舊字段名”設置爲相同的名稱而只改變數據類型

  由於不同的數據類型在機器中的存儲方式及長度的不同,修改數據類型可能會影響到數據表中已有的數據記錄,當數據表中已有數據時,不要輕易修改數據類型



4、添加字段

一個完整的字段包括字段名,數據類型,完整性約束

語法格式如下:

ALTER TABLE 表名 ADD 新字段名 數據類型 約束條件 [FIRST | AFTER 已經存在的字段名]

“表名”指要在哪個數據表中添加字段
“新字段名”指需要添加的字段名稱
“FIRST”爲可選參數,指將添加的字段表的第一個字段
“AFTER”爲可選參數,指將新添加的字段添加到指定的“已經存在的字段名”後面

若無可選參數“FIRST”和“AFTER 已存在的字段名”,則默認將新添加的字段設置爲數據表的最後一列

4.1、添加無完整性約束條件的字段

實例演示:

在數據表 tb_dept1 中添加一個沒有完整性約束的 INT 字段 managerId

DESC tb_dept1;
ALTER TABLE tb_dept1 ADD managerId INT(10);
DESC tb_dept1;

結果如下:結果展示


4.2、添加有完整性約束條件的字段

示例演示:

在數據表 tb_dept1 中添加一個不能爲空的 VARCHAR(12) 類型的字段column1

DESC tb_dept1;
ALTER TABLE tb_dept1 ADD column1 VARCHAR(12) NOT NULL;
DESC tb_dept1;

結果如下:
結果展示

4.3、在表的第一列添加一個字段

實例演示:

在數據表 tb_dept1 中添加一個 INT(11) 類型的字段 column2

DESC tb_dept1;
ALTER TABLE tb_dept1 ADD column2 INT(11) FIRST;
DESC tb_dept1;

結果如下:
結果展示


4.4、在表的指定列之後添加一個字段

實例演示:

在數據表 tb_dept1 中 name 列後添加一個 INT(11) 類型的字段 column3

DESC tb_dept1;
ALTER TABLE tb_dept1 ADD column3 INT(11) AFTER name;
DESC tb_dept1;

結果展示:
結果展示


5、刪除字段

刪除字段是將數據表中的某個字段從數據表中移除

語法格式如下:

ALTER TABLE 表名 FROP 字段名

“字段名”指要從表中刪除的字段的名稱

示例演示:

刪除數據表 tb_dept1 中的 column2 字段

DESC tb_dept1;
ALTER TABLE tb_dept1 DROP column2;
DESC tb_dept1;

結果如下:
結果展示


6、修改字段的排列位置

語法格式如下:

ALTER TABLE 表名 MODIFY 字段1 數據類型 FIRST | AFTER 字段2

“字段1” 指要修改位置的字段名稱
“數據類型” 指 “字段1” 的數據類型
“FIRST” 爲可選參數,指將 “字段1” 設置爲表的第一個字段
“AFTER 字段2” 指將 “字段1” 插入到 “ 字段2” 後面

6.1、修改字段爲表的第一個字段

示例演示:

將數據表 tb_dept1 中的 column1 字段修改爲數據表的第一個字段

DESC tb_dept1;
ALTER TABLE tb_dept1 MODIFY column1 VARCHAR(12) FIRST;
DESC tb_dept1;

結果如下:
結果展示


6.2、修改字段到表的指定列之後

將數據表 tb_dept1 中的 column1 字段插入到 location 字段後面

DESC tb_dept1;
ALTER TABLE tb_dept1 MODIFY column1 VARCHAR(12) AFTER location;
DESC tb_dept1;

結果如下:
結果展示


7、更改表的存儲引擎

  存儲引擎是MySQL中的數據存儲在文件或內存中時採用的不同技術實現

  MySQL中主要的存儲引擎有MyISAMInnoDBMEMORY(HEAP)BDBFEDERATED

7.1、查看系統支持的存儲引擎

演示:

SHOW ENGINES;

結果:
結果展示


7.2、更改表的存儲引擎

語法格式如下:

ALTER TABLE 表名 ENGINE = 更改後的存儲引擎名

示例演示:

將數據表 tb_department3 的存儲引擎修改爲MyISAM

SHOW CREATE TABLE tb_department43\G //查看數據表的存儲引擎
ALTER TABLE tb_department3 ENGINE = MyISAM;
SHOW CREATE TABLE tb_department43\G

結果如下:
結果展示


8、刪除表的外鍵約束

語法格式如下:

ALTER TABLE 表名 DROP FOREIGN KEY 外鍵約束名

“外鍵約束名”指在定義表時 CONSTRAINT 關鍵字後的參數

示例演示:

CREATE TABLE tb_emp9(
	id		INT(11) PRIMARY KEY,
	name	VARCHAR(25),
	deptId	INT(11),
	salary	FLOAT,
	CONSTRAINT fk_emp9_dept1 FOREIGN KEY (deptId) REFERENCES tb_dept1(id)
);

SHOW CREATE TABLE tb_emp9\G

ALTER TABLE tb_emp9 DROP FOREIGN KEY fk_emp9_dept1;	//刪除外鍵約束

SHOW CREATE TABLE tb_emp9\G

結果如下:
結果展示


四、刪除數據表

1、刪除沒有被關聯的表

  在MySQL中DROP TABLE可以一次刪除一個或多個沒有被其他表關聯的數據表

語法格式如下:

DROP TABLE IF EXISTS1,2,4, ..., 表n;

“表n”指要刪除的表的名稱

若要刪除的表不存在,則會拋出ERROR 1051 (42S02): Unknown table '表名

  參數IF EXISTS用於在刪除前判斷刪除的表是否存在,加上該參數後,在刪除表的時候,如果表不存在,SQL語句也可以順利執行,但是會發出警告。

示例演示:

刪除數據表 tb_dept2

DROP TABLE IF EXISTS tb_dept2;	//執行後發現表tb_dept2刪除成功

2、刪除被其他表關聯的主表

  在數據表之間存在外鍵關聯的情況下,直接刪除父表將失敗,其破壞了參照完整性。
  刪除的方式:
  1、先刪除與它關聯的子表,再刪除父表(子表和父表一起刪除)
  2、將關聯的表的外鍵約束條件取消,再刪除父表(保留子表)


實例演示(第2種方式):

CREATE TABLE tb_dept2(
	id			INT(11) PRIMARY KEY,
	name		VARCHAR(22),
	location	VARCHAR(50)
);

CREATE TABLE tb_emp(
	id		INT(11) PRIMARY KEY,
	namne	VARCHAR(25),
	deptId	INT(11),
	salary	FLOAT,
	CONSTRAINT fk_emp_dept2 FOREIGN KEY (deptId) REFERENCES tb_dept2(id)
);

  其中,“tb_emp”表爲子表,具有“fk_emp_dept2”的外鍵約束;“tb_dept2”爲父表,其主鍵被子表“tb_emp”所關聯。

若直接刪除其父表(測試)

DROP TABLE tb_dept2;

結果如下:
結果展示

拋出ERROR 3730 (HY000): Cannot drop table 'tb_dept2' referenced by a foreign key constraint 'fk_emp_dept2' on table 'tb_emp'.異常

正確打開方式:

(1)解除關聯子表的外鍵約束fk_emp_dept2

ALTER TABLE tb_emp DROP FOREIGN KEY fk_emp_dept2;

(2)刪除父表tb_dept2

DROP TABLE tb_dept2;

執行SHOW TABLES可以發現tb_dept2數據表已經刪除成功。


五、MySQL8.0的新特性1——默認字符集改爲utf8mb4

  在MySQL8.0之前,默認字符集爲latin1utf8字符集指向的是utf8mb3;從MySQL8.0開始默認改爲utf8mb4,避免亂碼。

1、在MySQL5.X版本中,查看數據庫的默認編碼

SHOW VARIABLES LIKE 'character_set_database';

結果將顯示爲 latin1(拉丁語)

2、在MySQL5.X版本中,查看數據表的默認編碼

SHOW CREATE TABLE tb_emp1\G

結果也將顯示爲 latin1(拉丁語)

3、在MySQL8.0版本中,測試數據庫默認編碼

SHOW VARIABLES LIKE 'character_set_database';

結果如下:
結果展示

4、在MySQL8.0版本中,查看數據表的默認編碼

SHOW CREATE TABLE tb_emp1\G

結果如下:
結果展示

六、MySQL8.0新特性2——自增變量的持久化

  在MySQL8.0之前,自增主鍵AUTO_INCREMENT的值如果大於max(primary key) + 1,在MySQL重啓後,會重置AUTO_INCREMENT = max(primary key) + 1這種現象。

測試:

在MySQL5.X版本中:

創建測試數據表test1
CREATE TABLE test1 (
	id INT AUTO_INCREMENT PRIMARY KEY
);

插入4個空值
INSERT INTO test1 VALUES (0), (0), (0), (0);

查詢數據表test1中的數據
SELECT * FROM test1;	//結果將顯示[1 2 3 4]'

刪除id爲4的記錄
DELETE FROM test1 WHERE id = 4;

再插入一個空值
INSERT INTO test1 VALUES (0);

再查看數據表test1中的數據
SELECT * FROM test1;	//結果將顯示[1 2 3 5]'
//由此可以看出,刪除了id = 4的記錄,再次插入空值時,並沒有重用被刪除的4,而是分配了5

再刪除id = 5的記錄
DELETE FROM test1 WHERE id = 5;

重啓數據庫,重新插入一個空值
INSERT INTO test1 VALUES (0);

再次查詢數據表test1中的數據
SELECT * FROM test1;	//結果將顯示[1 2 3 4]'
//由此可以看出,新插入的0值分配的是4,按照未重啓前的邏輯,此時應該分配6。
//出現此現象的原因是:自增主鍵沒有持久化。

  在MySQL5.7系統中,對於自增主鍵的分配規則,是由InnoDB數據字典內部的一個計數器來決定的。而該計數器值在內存中維護,並不會持久化到磁盤中。當數據庫重啓時,該計數器通過SELECT MAX(ai_col) FROM table_name FOR UPDATE方式初始化,


在MySQL8.0版本中:

  MySQL8.0將自增主鍵的計數器持久化到重做日誌中,每次計數器發生改變,都會將其寫入重做日誌中。如果數據庫重啓,InnoDB會根據重做日誌中的信息來初始化計數器的內存值,
  爲了減少對系統性能的影響,計數器寫入到重做日誌時並不會馬上刷新數據庫系統。


補充

1、並不是每個表都可以任意選擇存儲引擎

  外鍵約束不能跨引擎使用,外鍵約束是用來保證數據的參照完整性的,如果表之間需要關聯外鍵,卻指定了不同的存儲引擎,那麼這些表之間是不可以創建外鍵約束的
  默認AUTO_INCREMENT的初始值爲1,可以指定第一條插入記錄的id值來指定自增字段的值從何處開始自增。
  添加唯一性的主鍵約束時,往往需要設置字段自動增加屬性。


總結

轉載請註明https://blog.csdn.net/weixin_43754860/article/details/113408495

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章