數據表的基本操作
一、創建數據表
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語句創建數據表之後,爲了查看數據表的結構定義以確認是否正確,可以使用DESCRIBE
和SHOW 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中主要的存儲引擎有MyISAM
,InnoDB
,MEMORY(HEAP)
,BDB
,FEDERATED
等
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 EXISTS 表1, 表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之前,默認字符集爲
latin1
,utf8
字符集指向的是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