《MySQL 5.7 從零開始學》筆記-資料表基本操作
在資料庫中,資料表是資料庫中最重要、最基本的操作物件,是資料儲存的基本單位。資料表被定義為列的集合,資料在表中是按照行和列的格式來儲存的。每一行代表一條唯一的記錄,每一列代表記錄中的一個域。
建立資料表
所謂建立資料表,指的是在已經建立好的資料庫中建立新表。建立資料表的過程是規定資料列的屬性的過程,同時也是實施資料完整性(包括實體完整性、引用完整性和域完整性等)約束的過程。
資料表屬於資料庫,在建立資料表之前,應該使用語句USE <資料庫名>
指定操作的是在哪一個資料庫中進行,如果沒有選擇資料庫,就會丟擲”No database selected”的錯誤。
建立資料表的語句為CREATE TABLE
CREATE TABLE <表名>
(
列名1,資料型別 [列級別約束條件] [預設值],
列名2,資料型別 [列級別約束條件] [預設值],
……
[表級別約束條件]
);
使用CREATE TABLE
建立表時,必須指定以下資訊:
- 要建立的表的名稱,不區分大小寫,不能使用SQL語言中的關鍵字,如 DROP、ALTER、INSERT等
- 資料表中的每一個列(欄位)的名稱和資料型別。如果建立多個列,就要用逗號隔開。
例如:
- 1.建立資料庫 - teaphy
mysql> CREATE DATABASE teaphy
-> ;
Query OK, 1 row affected (0.18 sec)
- 2.選擇建立表的資料庫 - teaphy
mysql> USE teaphy
Database changed
- 3.建立表
mysql> CREATE TABLE teaphy_emp1
-> (
-> id INT(11),
-> name VARCHAR(25),
-> depid INT(11),
-> salary FLOAT
-> );
- 4 使用
HOW TABLES;
命令檢視資料表是否建立成功
mysql> SHOW TABLES;
+------------------+
| Tables_in_teaphy |
+------------------+
| teaphy_emp1 |
+------------------+
1 row in set (0.02 sec)
可以看到,teaphy資料庫中已經有了資料表teaphy_emp1,資料表建立成功。
使用主鍵約束
主鍵又稱為主碼,是表中一列或多列的組合。主鍵約束(Primary Key Contraint)要求主鍵列的資料唯一,並且不允許為空。主鍵能夠唯一地標識表中的一條記錄,可以結合外來鍵來定義不同資料表之間的關係,並且可以加快資料庫查詢的速度。主鍵和記錄之間的關係如同身份證和人的關係,它們之間是一一對應的。
主鍵分為兩種型別:單欄位主鍵和多欄位聯合主鍵。
單欄位主鍵
主鍵由一個欄位組成。
SQL語句格式分為兩種情況:
在定義列的同時指定主鍵,語法規則為:
欄位名 資料型別 PRIMARY KEY [預設值]
例如:
mysql> CREATE TABLE teaphy_emp2
-> (
-> id INT(11) PRIMARY KEY,
-> name VARCHAR(25),
-> depid INT(11),
-> salary FLOAT
-> );
Query OK, 0 rows affected (0.53 sec)
在建立的teaphy_emp2表中,其主鍵為 id
2. 在定義完所有列之後指定主鍵,語法規則為:[CONSTRAINT <約束名> PRIMARY KEY [欄位名]]
。
例如:
mysql> CREATE TABLE teaphy_emp3
-> (
-> id INT(11),
-> name VARCHAR(25),
-> depid INT(11),
-> salary FLOAT,
-> CONSTRAINT teaphy_emp3_pri PRIMARY KEY(id)
-> );
Query OK, 0 rows affected (0.43 sec)
建立了資料表teaphy_emp3,在所有列宣告以後,指定id為主鍵,其約束名為teaphy_emp3_pri.
多欄位聯合主鍵
主鍵由多個欄位聯合組成,其語法規則為:`PRIMARY KEY [欄位1, 欄位2,…, 欄位n]
例如:
mysql> CREATE TABLE teaphy_emp4
-> (
-> name VARCHAR(25),
-> depid INT(11),
-> salary FLOAT,
-> PRIMARY KEY(name, depid)
-> );
Query OK, 0 rows affected (0.76 sec)
語句執行結束以後,建立了新表teaphy_emp4,其中,name
欄位和depid
欄位組合一起成為teaphy_emp4的多欄位聯合主鍵。
使用外來鍵約束
外來鍵用來在兩個表的資料之間建立連結,可以是一列或者多列。一個表可以有一個或多個外來鍵。外來鍵對應的是參照完整性,一個表的外來鍵可以為空值,若不為空值,則每一個外來鍵值必須為另個表中的主鍵的某個值。
外來鍵首先是表中的一個欄位,可以不是本表的主鍵,但要對應另外一個表中的主鍵。外來鍵的主要作用是保證資料的完整性,定義外來鍵後,不允許刪除在另外一個表中具有關聯關係的行。
- 主表(父表):對於兩個具有關聯關係的表而言,相關聯欄位中主鍵所在的那個表。
- 從表(字表):對於兩個具有關聯關係的表而言,相關聯欄位中外來鍵所在的那個表。
建立外來鍵的語法規則:
[CONSTRAINT <外來鍵名>] FOREIGN KEY 欄位名1 [ ,欄位名2,…]
REFERENCES <主表名> 主鍵列1 [ ,主鍵列2,…]
其中:
- 外來鍵名:定義外來鍵約束的名稱,一個表中不能有相同名稱的外來鍵
- 欄位名:表示子表需要新增外來鍵約束的欄位列
- 主表名:表示被子表外來鍵所依賴的表的名稱
- 主鍵列:表示主表中定義的主鍵列或者列組合
例如:
- 1.建立主表 - teaphy_dept1,其主鍵為
id
mysql> CREATE TABLE teaphy_dept1
-> (
-> id INT(11) PRIMARY KEY,
-> name VARCHAR(25),
-> location VARCHAR(60)
-> );
Query OK, 0 rows affected (0.54 sec)
- 2.建立子表 - teaphy_dept2
mysql> CREATE TABLE teaphy_dept2
-> (
-> id INT(11) PRIMARY KEY,
-> name VARCHAR(25),
-> depId INT(11),
-> salary FLOAT,
-> CONSTRAINT fk_ept_dept1 FOREIGN KEY(depId) REFERENCES teaphy_dept1(id)
-> );
Query OK, 0 rows affected (0.84 sec)
在表teaphy_dept2中,添加了名為fk_ept_dept1
的外來鍵約束,外來鍵名稱為depId
,其依賴於表teaphy_dept1的主鍵id
使用非空約束
非空約束(Not Null constraint)指欄位的值不能為空。對於使用了非空約束的欄位如果使用者在新增資料時,沒有指定值,資料庫系統會報錯。
非空約束的語法規則:欄位名 資料型別 not null
例如:
mysql> CREATE TABLE teaphy_emp5
-> (
-> id INT(11) PRIMARY KEY,
-> name VARCHAR(25) NOT NULL,
-> age INT(3)
-> );
Query OK, 0 rows affected (0.41 sec)
執行該SQL語句後,建立表teaphy_emp5,其中欄位name
的插入值不能為空(NOT NULL).
使用唯一性約束
唯一性約束(Unique Constraint)要求該列唯一,允許為空,但只能出現一個空值。唯一約束可以確保一列或者幾列不出現重複值。
唯一性約束的語法規則如下:
- 在定義完列之後直接指定唯一約束,語法規則為:
欄位名 資料型別 UNIQUE
例如:
mysql> CREATE TABLE teaphy_emp6
-> (
-> id INT(11) PRIMARY KEY,
-> name VARCHAR(25) UNIQUE,
-> age INT(11)
-> );
Query OK, 0 rows affected (0.84 sec)
執行該SQL語句後,建立表teaphy_emp6,指定欄位name
唯一。
2. 在定義完所有列之後,指定唯一約束,語法規則為:[CONSTRAINT <約束名>] UNIQUE 欄位名
例如:
mysql> CREATE TABLE teaphy_emp7
-> (
-> id INT(11) PRIMARY KEY,
-> name VARCHAR(25),
-> age INT(3),
-> CONSTRAINT u_name UNIQUE(name)
-> );
Query OK, 0 rows affected (0.44 sec)
執行該SQL語句後,建立表teaphy_emp7,指定欄位name
唯一,並且指定唯一約束的名稱為u_name
。
UNIQUE
和PRIMARY KEY
的區別:
- 一個表中可以有多個欄位宣告為
UNIQUE
,但是隻能有一個PRIMARY KEY
宣告 - 宣告為
PRIMARY KEY
的列不允許有空值,但是宣告UNIQUE
的欄位允許控制(NULL)存在
使用預設約束
預設約束(Default Constraint)指定某列的預設值。例如,成年人的年齡認定為大於等於18.如果插入一條記錄時沒有為age
這個欄位賦值,那麼系統會自動為這個欄位賦值為18.
預設約束的語法規則:欄位名 資料型別 DEFAULT 預設值
例如:
mysql> CREATE TABLE teaphy_emp8
-> (
-> id INT(11) PRIMARY KEY,
-> name VARCHAR(25),
-> age INT(3) DEFAULT 18
-> );
Query OK, 0 rows affected (0.56 sec)
執行該SQL語句後,建立表teaphy_emp8,其中欄位age
擁有了預設值18,新插入的記錄,如果沒有指定年齡,則預設為18.
設定表的屬性值自動增加
在資料庫應用中,經常希望在每次插入新記錄時,系統就會自動生成欄位的主鍵值。可以通過為表主鍵新增AUTO_INCREMENT關鍵字來實現。一個表只能有一個欄位使用AUTO_INCREMENT約束,且該欄位必須為主鍵的一部分。AUTO_INCREMENT約束的欄位可以是任何整數型別(TINYINT、SMALLINT、INT、BIGINT等)。
設定表的屬性值自動增加的語法規則:欄位名 資料型別 AUTO_INCREMENT
例如:
mysql> CREATE TABLE teaphy_emp9
-> (
-> id INT(11) PRIMARY KEY AUTO_INCREMENT,
-> name VARCHAR(25),
-> age INT(3)
-> );
Query OK, 0 rows affected (0.55 sec)
執行該SQL語句後,建立表teaphy_emp9,其主鍵id
欄位的值在新增新記錄時會自動增加,在插入記錄時,預設的自增欄位id
從1開始,每次新增一條新記錄,該值自動加1.
檢視資料表結構
使用SQL語句建立好資料表以後,可以查看錶結構的定義,以確保表的定義是否正確。在MySql中,查看錶結構使用DESCRIBE
和SHOW CREATE TABLE
語句。
DESCRIBE/DESC
DESCRIBE/DESC語句可以查看錶的欄位資訊,其中包括:欄位名、欄位資料型別、是否為主鍵、是否有預設值等。
DESCRIBE/DESC的語法規則
DESCRIBE <表名>
DESC <表名>
例如:
- 1.使用
DESCRIBE
命令查看錶teaphy_emp1
mysql> DESCRIBE teaphy_emp1;
+--------+-------------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+--------+-------------+------+-----+---------+-------+
| id | int(11) | YES | | NULL | |
| name | varchar(25) | YES | | NULL | |
| depid | int(11) | YES | | NULL | |
| salary | float | YES | | NULL | |
+--------+-------------+------+-----+---------+-------+
4 rows in set (0.00 sec)
- 2.使用
DESC
命令查看錶teaphy_emp1
mysql> DESC teaphy_emp1;
+--------+-------------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+--------+-------------+------+-----+---------+-------+
| id | int(11) | YES | | NULL | |
| name | varchar(25) | YES | | NULL | |
| depid | int(11) | YES | | NULL | |
| salary | float | YES | | NULL | |
+--------+-------------+------+-----+---------+-------+
4 rows in set (0.00 sec)
其中,各個欄位的含義如下:
- Field:表示欄位名稱
- Type:表示欄位型別
- Null:表示該列是否可以儲存NULL值
Key:表示該列是否已編制索引。
- PRI:表示該列時表主鍵的一部分
- UNI:表示該列是UNIQUE索引的一部分
- MUL:表示在列中某個給定的值允許重複出現多次
- Default:表示該列是否有預設值,如有的話,值是多少
- Extra:表示可以獲取的與給定列有關的附加資訊。
查看錶詳細結構語句SHOW CREATE TABLE
SHOW CREATE TABLE
語句可以用來顯示資料表的建立語句。語法格式為:SHOW CREATE TABLE <表名\G>
- 使用
SHOW CREATE TABLE
語句,不僅可以檢視資料表的建立語句,還可以檢視儲存引擎和字元編碼- 如果不加
\G
引數,那麼顯示的結果可能非常混亂;加上引數\G
之後,可使結果顯示的更加直觀。
例如:
mysql> SHOW CREATE TABLE teaphy_emp1 \G;
*************************** 1. row ***************************
Table: teaphy_emp1
Create Table: CREATE TABLE `teaphy_emp1` (
`id` int(11) DEFAULT NULL,
`name` varchar(25) DEFAULT NULL,
`depid` int(11) DEFAULT NULL,
`salary` float DEFAULT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci
1 row in set (0.00 sec)
ERROR:
No query specified
修改資料表
修改資料表指的是修改資料庫中,已經存在的資料表的結構。MySQL使用ALTER TABLE
語句修改資料表。常用的操作有修改表名、修改欄位資料型別或欄位名、增加和刪除欄位、修改欄位的排列位置,更改表的儲存引擎,刪除表的外來鍵約束等。
修改表名
MySQL是通過ALTER TABLE
語句來實現表名的修改的。語法規則為:ALTER TABLE <舊錶名> RENAME [TO] <新表名>;
例如:
mysql> ALTER TABLE teaphy_emp1 RENAME teaphy_alter1;
Query OK, 0 rows affected (0.40 sec)
執行SQL語句,將表teaphy_emp1
改名為teaphy_alter1
.
修改欄位的資料型別
修改欄位的資料型別,就是把欄位的資料型別轉換成另一種資料型別。
語法規則為:ALTER TABLE <表名> MODIFY <欄位名> <資料型別>
例如:
- 1.使用
DESC
查看錶teaphy_emp2的表結構:
mysql> DESC teaphy_emp2;
+--------+-------------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+--------+-------------+------+-----+---------+-------+
| id | int(11) | NO | PRI | NULL | |
| name | varchar(25) | YES | | NULL | |
| depid | int(11) | YES | | NULL | |
| salary | float | YES | | NULL | |
+--------+-------------+------+-----+---------+-------+
4 rows in set (0.00 sec)
- 2.使用
ALTER TABLE
語句,將name的資料型別由VARCHAR(25)修改為VARCHAR(40)
mysql> ALTER TABLE teaphy_emp2 MODIFY name VARCHAR(40);
Query OK, 0 rows affected (0.23 sec)
Records: 0 Duplicates: 0 Warnings: 0
- 3.再次使用使用
DESC
查看錶teaphy_emp2的表結構
mysql> DESC teaphy_emp2;
+--------+-------------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+--------+-------------+------+-----+---------+-------+
| id | int(11) | NO | PRI | NULL | |
| name | varchar(40) | YES | | NULL | |
| depid | int(11) | YES | | NULL | |
| salary | float | YES | | NULL | |
+--------+-------------+------+-----+---------+-------+
4 rows in set (0.02 sec)
這時,可以清楚地看到teaphy_emp2中的name欄位的資料型別已經修改為VARCHAR(40)
修改欄位名稱
MySQL中修改表字段名的語法規則如下:ALTER TABLE <表名> CHANGE <舊欄位名> <新欄位名> <新資料型別>;
其中:
- 舊欄位名:指修改前的欄位名
- 新欄位名:指修改後的欄位名
- 新資料型別:指修改後的欄位名的資料型別。如果需要修改欄位的資料型別,將新資料型別設定成與原來一樣即可,但資料型別不能為空。
例如:
- 1.使用
DESC
查看錶teaphy_emp2的表結構:
mysql> DESC teaphy_emp2;
+--------+-------------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+--------+-------------+------+-----+---------+-------+
| id | int(11) | NO | PRI | NULL | |
| name | varchar(40) | YES | | NULL | |
| depid | int(11) | YES | | NULL | |
| salary | float | YES | | NULL | |
+--------+-------------+------+-----+---------+-------+
4 rows in set (0.00 sec)
- 2.使用
ALTER TABLE
語句將name
修改為n_name
,並且將資料型別修改為 VARCHAR(25)
mysql> ALTER TABLE teaphy_emp2 CHANGE name n_name VARCHAR(25);
Query OK, 0 rows affected (1.11 sec)
Records: 0 Duplicates: 0 Warnings: 0
- 3.使用
DESC
查看錶teaphy_emp2的表結構:
mysql> DESC teaphy_emp2;
+--------+-------------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+--------+-------------+------+-----+---------+-------+
| id | int(11) | NO | PRI | NULL | |
| n_name | varchar(25) | YES | | NULL | |
| depid | int(11) | YES | | NULL | |
| salary | float | YES | | NULL | |
+--------+-------------+------+-----+---------+-------+
4 rows in set (0.00 sec)
CHANGE
也可以只修改資料型別,實現MODIFY
同樣的效果,方法是將SQL語句中的‘新欄位名’和‘舊欄位名’設定為相同的名稱,只改變‘資料型別’。
由於不同的資料型別的資料在機器中儲存的方式及長度並不相同,修改資料型別可能會影響到資料表中已有資料記錄,因此當資料表已經有資料時,不要輕易修改資料型別。
新增欄位
一個完整的欄位包括欄位名、資料型別、完整性約束。在已經存在的表新增新的完整欄位的語法規則為:ALTER TABLE <表名> ADD <新欄位名> <資料型別> [約束條件] [FIRST | AFTER 已存在欄位名];
其中:
- 新欄位名:指需要新增的欄位名稱
FIRST
或AFTER 已存在欄位名
用於指定新增欄位在表中的位置。如果SQL語句中沒有這兩個引數,就預設將新新增的欄位設定為資料表的最後列。
新增無完整性約束條件的欄位
- 1.使用
DESC
命令檢視teaphy_emp3
的表結構
mysql> DESC teaphy_emp3;
+--------+-------------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+--------+-------------+------+-----+---------+-------+
| id | int(11) | NO | PRI | NULL | |
| name | varchar(25) | YES | | NULL | |
| depid | int(11) | YES | | NULL | |
| salary | float | YES | | NULL | |
+--------+-------------+------+-----+---------+-------+
4 rows in set (0.00 sec)
- 2.使用
ALTER TABLE
語句新增無完整性約束條件的欄位column0
mysql> ALTER TABLE teaphy_emp3 ADD column0 INT(10);
Query OK, 0 rows affected (0.82 sec)
Records: 0 Duplicates: 0 Warnings: 0
- 3.使用
DESC
命令檢視teaphy_emp3
的表結構
mysql> DESC teaphy_emp3;
+---------+-------------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+---------+-------------+------+-----+---------+-------+
| id | int(11) | NO | PRI | NULL | |
| name | varchar(25) | YES | | NULL | |
| depid | int(11) | YES | | NULL | |
| salary | float | YES | | NULL | |
| column0 | int(10) | YES | | NULL | |
+---------+-------------+------+-----+---------+-------+
5 rows in set (0.00 sec)
新增有完整性約束條件的欄位
- 1.使用
ALTER TABLE
語句新增不能為空的欄位column1
mysql> ALTER TABLE teaphy_emp3 ADD column1 INT(10) NOT NULL;
Query OK, 0 rows affected (1.09 sec)
Records: 0 Duplicates: 0 Warnings: 0
- 2.使用
DESC
命令檢視teaphy_emp3
的表結構
mysql> DESC teaphy_emp3;
+---------+-------------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+---------+-------------+------+-----+---------+-------+
| id | int(11) | NO | PRI | NULL | |
| name | varchar(25) | YES | | NULL | |
| depid | int(11) | YES | | NULL | |
| salary | float | YES | | NULL | |
| column0 | int(10) | YES | | NULL | |
| column1 | int(10) | NO | | NULL | |
+---------+-------------+------+-----+---------+-------+
6 rows in set (0.00 sec)
在表的第一列新增一個欄位
- 1.使用
ALTER TABLE
語句在新增欄位column2
mysql> ALTER TABLE teaphy_emp3 ADD column2 INT(10) FIRST;
Query OK, 0 rows affected (0.94 sec)
Records: 0 Duplicates: 0 Warnings: 0
- 2.使用
DESC
命令檢視teaphy_emp3
的表結構
mysql> DESC teaphy_emp3;
+---------+-------------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+---------+-------------+------+-----+---------+-------+
| column2 | int(10) | YES | | NULL | |
| id | int(11) | NO | PRI | NULL | |
| name | varchar(25) | YES | | NULL | |
| depid | int(11) | YES | | NULL | |
| salary | float | YES | | NULL | |
| column0 | int(10) | YES | | NULL | |
| column1 | int(10) | NO | | NULL | |
+---------+-------------+------+-----+---------+-------+
7 rows in set (0.00 sec)
此時發現,在表teaphy_emp3第一列添加了欄位column2。
在表的指定位置新增一個欄位
- 1.使用
ALTER TABLE
語句在新增欄位column3
mysql> ALTER TABLE teaphy_emp3 ADD column3 INT(10) AFTER name;
Query OK, 0 rows affected (0.94 sec)
Records: 0 Duplicates: 0 Warnings: 0
- 2.使用
DESC
命令檢視teaphy_emp3
的表結構
mysql> DESC teaphy_emp3;
+---------+-------------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+---------+-------------+------+-----+---------+-------+
| column2 | int(10) | YES | | NULL | |
| id | int(11) | NO | PRI | NULL | |
| name | varchar(25) | YES | | NULL | |
| column3 | int(10) | YES | | NULL | |
| depid | int(11) | YES | | NULL | |
| salary | float | YES | | NULL | |
| column0 | int(10) | YES | | NULL | |
| column1 | int(10) | NO | | NULL | |
+---------+-------------+------+-----+---------+-------+
8 rows in set (0.00 sec)
此時發現,在表teaphy_emp中,在namelie後面新增欄位column3
刪除欄位
刪除欄位是將資料表中的某個欄位從表中移除。語法格式為:ALTER TABLE <表名> DROP <欄位名>;
- 1.使用
DESC
命令檢視teaphy_emp4
的表結構
mysql> DESC teaphy_emp4;
+--------+-------------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+--------+-------------+------+-----+---------+-------+
| name | varchar(25) | NO | PRI | NULL | |
| depid | int(11) | NO | PRI | NULL | |
| salary | float | YES | | NULL | |
+--------+-------------+------+-----+---------+-------+
3 rows in set (0.00 sec)
- 2.使用
ALTER TABLE
刪除欄位salary
mysql> ALTER TABLE teaphy_emp4 DROP salary;
Query OK, 0 rows affected (1.01 sec)
Records: 0 Duplicates: 0 Warnings: 0
- 3.使用
DESC
命令檢視teaphy_emp4
的表結構
mysql> DESC teaphy_emp4;
+-------+-------------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+-------+-------------+------+-----+---------+-------+
| name | varchar(25) | NO | PRI | NULL | |
| depid | int(11) | NO | PRI | NULL | |
+-------+-------------+------
修改欄位的排列位置
對於一個數據表來說,在建立的時候,欄位在表中的排列順序已經確定了。但是,表的結構並不是完全不可以改變的,可以通過ALTER TABLE
來改變表中欄位的相對位置。語法格式為:ALTER TABLE <表名> MODIFY <欄位1> <資料型別> FIRST|AFTER <欄位2>;
- 欄位1:指要修改位置的欄位
- 資料型別:指欄位1的資料型別
FIRST
:可選引數,指將欄位1
修改為表的第一欄位AFTER <欄位2>
:指將欄位1
插入到欄位2
後面
修改欄位為表的第一個欄位
- 1.使用
DESC
命令檢視teaphy_emp2
的表結構
mysql> DESC teaphy_emp2;
+--------+-------------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+--------+-------------+------+-----+---------+-------+
| id | int(11) | NO | PRI | NULL | |
| n_name | varchar(25) | YES | | NULL | |
| depid | int(11) | YES | | NULL | |
| salary | float | YES | | NULL | |
+--------+-------------+------+-----+---------+-------+
4 rows in set (0.00 sec)
- 2.使用
ALTER TABLE
語句修改depid的位置
mysql> ALTER TABLE teaphy_emp2 MODIFY depid INT(11) FIRST;
Query OK, 0 rows affected (0.90 sec)
Records: 0 Duplicates: 0 Warnings: 0
- 3.使用
DESC
命令檢視teaphy_emp2
的表結構
mysql> DESC teaphy_emp2;
+--------+-------------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+--------+-------------+------+-----+---------+-------+
| depid | int(11) | YES | | NULL | |
| id | int(11) | NO | PRI | NULL | |
| n_name | varchar(25) | YES | | NULL | |
| salary | float | YES | | NULL | |
+--------+-------------+------+-----+---------+-------+
4 rows in set (0.00 sec)
修改欄位到表的指定列之後
- 1.使用
ALTER TABLE
語句,將depid放到salary欄位後面
mysql> ALTER TABLE teaphy_emp2 MODIFY depid INT(11) AFTER salary;
Query OK, 0 rows affected (1.20 sec)
Records: 0 Duplicates: 0 Warnings: 0
- 2.使用
DESC
命令檢視teaphy_emp2
的表結構
mysql> DESC teaphy_emp2;
+--------+-------------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+--------+-------------+------+-----+---------+-------+
| id | int(11) | NO | PRI | NULL | |
| n_name | varchar(25) | YES | | NULL | |
| salary | float | YES | | NULL | |
| depid | int(11) | YES | | NULL | |
+--------+-------------+------+-----+---------+-------+
4 rows in set (0.00 sec)
刪除表的外來鍵約束
對於資料庫中定義的外來鍵,如果不再需要,可以將其刪除。外來鍵一旦刪除,就會解除主表和從表間的關聯關係。MySQL中刪除外來鍵的語法格式:ALTER TABLE <表名> DROP FOREIGN KEY <外來鍵約束名>
- 1.建立表teaphy_emp10,建立外來鍵depId關聯teaphy_emp1表的主鍵id
mysql> CREATE TABLE teaphy_emp10
-> (
-> id INT(11) PRIMARY KEY,
-> name VARCHAR(25),
-> depId INT(11),
-> CONSTRAINT fk_emp1 FOREIGN KEY (depId) REFERENCES teaphy_emp1(id)
-> );
Query OK, 0 rows affected (0.80 sec)
- 2.使用
SHOW CREATE TABLE
檢視teaphy_emp10的表結構
mysql> SHOW CREATE TABLE teaphy_emp10 \G;
*************************** 1. row ***************************
Table: teaphy_emp10
Create Table: CREATE TABLE `teaphy_emp10` (
`id` int(11) NOT NULL,
`name` varchar(25) DEFAULT NULL,
`depId` int(11) DEFAULT NULL,
PRIMARY KEY (`id`),
KEY `fk_emp1` (`depId`),
CONSTRAINT `fk_emp1` FOREIGN KEY (`depId`) REFERENCES `teaphy_emp1` (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci
1 row in set (0.00 sec)
- 3.使用
ALTER TABLE
語句刪除外來鍵約束fk_emp1
mysql> ALTER TABLE teaphy_emp10 DROP FOREIGN KEY fk_emp1;
Query OK, 0 rows affected (0.22 sec)
Records: 0 Duplicates: 0 Warnings: 0
- 4.使用
SHOW CREATE TABLE
檢視teaphy_emp10的表結構
mysql> SHOW CREATE TABLE teaphy_emp10 \G;
*************************** 1. row ***************************
Table: teaphy_emp10
Create Table: CREATE TABLE `teaphy_emp10` (
`id` int(11) NOT NULL,
`name` varchar(25) DEFAULT NULL,
`depId` int(11) DEFAULT NULL,
PRIMARY KEY (`id`),
KEY `fk_emp1` (`depId`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci
1 row in set (0.00 sec)
可以看到,表teaphy_emp10中已經不存在FOREIGN KEY
,原有的外來鍵約束fk_emp1
刪除成功。
刪除資料表
刪除資料表就是將資料庫中已經存在的表從資料庫中刪除。注意,在刪除表的同時,表的定義和表中所有的資料均會被刪除。因此,在進行刪除操作之前,最好對錶中的資料做一個備份,以免造成無法挽回的後果。
刪除沒有被關聯的表
MySQL中,使用DROP TABLE可以一次刪除一個或多個沒有被其它表關聯的資料表。語法格式為DROP TABLE [IF EXISTS]表1, 表2, . . . 表n;
其中:
表n
:指要刪除的表的名稱,後面可以同時刪除多個表,只需要將刪除的表名依次寫在後面,相互之間用逗號隔開。
如果刪除的表不存在,則MySQL會提示一條錯誤資訊,ERROR 1051 (42S02): Unknown table <表名>
。
mysql> DROP TABLE teaphy;
ERROR 1051 (42S02): Unknown table 'teaphy.teaphy'
引數IF EXISTS
用於在刪除前判斷刪除的表是否存在,加上該引數以後,再刪除表的時候,如果表不存在,SQL語句可以順利執行,但是會發出警告。
mysql> DROP TABLE IF EXISTS teaphy;
Query OK, 0 rows affected, 1 warning (0.05 sec)
刪除被其它表關聯的主表
在資料表之間存在外來鍵關聯的情況下,如果直接刪除父表,結果會顯示失敗,原因是直接刪除,將破壞表的參照完整性。如果必須要刪除,可以先刪除與之關聯的子表,再刪除父表。但是這樣同時刪除了兩個表中的資料。但有的情況下可能要保留子表,這時如要單獨刪除父表,只需將關聯的表的外來鍵約束條件取消,然後就可以刪除父表。
例如:
- 1.建立表teaphy_dept1
mysql> CREATE TABLE teaphy_dept1
-> (
-> id INT(11) PRIMARY KEY,
-> name VARCHAR(10),
-> age INT(3)
-> );
Query OK, 0 rows affected (0.56 sec)
- 2.建立表teaphy_dept2
mysql> CREATE TABLE teaphy_dept2
-> (
-> id INT(11) PRIMARY KEY,
-> name VARCHAR(10),
-> deptId INT(11),
-> salary FLOAT,
-> CONSTRAINT fk_emp_dept FOREIGN KEY(deptId) REFERENCES teaphy_dept1(id)
-> );
Query OK, 0 rows affected (0.87 sec)
- 3.使用
SHOW CREATE TABLE
命令檢視teaphy_dept2的外來鍵約束
mysql> SHOW CREATE TABLE teaphy_dept2 \G;
*************************** 1. row ***************************
Table: teaphy_dept2
Create Table: CREATE TABLE `teaphy_dept2` (
`id` int(11) NOT NULL,
`name` varchar(10) DEFAULT NULL,
`deptId` int(11) DEFAULT NULL,
`salary` float DEFAULT NULL,
PRIMARY KEY (`id`),
KEY `fk_emp_dept` (`deptId`),
CONSTRAINT `fk_emp_dept` FOREIGN KEY (`deptId`) REFERENCES `teaphy_dept1` (`id`)
) ENGINE=InnoDB DEFAULT C
可以看到,以上執行SQL語句,建立了兩個關聯表teaphy_dept1和teaphy_dept2,其中主表為teaphy_dept1,其主鍵id被子表teaphy_dept2所關聯;從表為teaphy_dept2,具有名稱為fk_emp_dept的外來鍵約束
- 4.直接執行DROP TABLE
命令刪除父表teaphy_dept1
mysql> DROP TABLE teaphy_dept1;
ERROR 1217 (23000): Cannot delete or update a parent row: a foreign key constraint fails
從錯誤提示中,可以看出,在存在外來鍵約束時,主表不能被直接刪除
- 5.解除關聯子表teaphy_dept2的外來鍵約束fk_emp_dept
mysql> ALTER TABLE teaphy_dept2 DROP FOREIGN KEY fk_emp_dept;
Query OK, 0 rows affected (0.20 sec)
Records: 0 Duplicates: 0 Warnings: 0
- 6.刪除父表teaphy_dept1
mysql> DROP TABLE teaphy_dept1;
Query OK, 0 rows affected (0.40 sec)
參考文獻
- MySQL 5.7 從零開始學