1. 程式人生 > >《MySQL 5.7 從零開始學》筆記-資料表基本操作

《MySQL 5.7 從零開始學》筆記-資料表基本操作

在資料庫中,資料表是資料庫中最重要、最基本的操作物件,是資料儲存的基本單位。資料表被定義為列的集合,資料在表中是按照行和列的格式來儲存的。每一行代表一條唯一的記錄,每一列代表記錄中的一個域。

建立資料表

所謂建立資料表,指的是在已經建立好的資料庫中建立新表。建立資料表的過程是規定資料列的屬性的過程,同時也是實施資料完整性(包括實體完整性、引用完整性和域完整性等)約束的過程。

資料表屬於資料庫,在建立資料表之前,應該使用語句USE <資料庫名>指定操作的是在哪一個資料庫中進行,如果沒有選擇資料庫,就會丟擲”No database selected”的錯誤。

建立資料表的語句為CREATE TABLE

,語法規則如下:

CREATE  TABLE <表名>
    (
    列名1,資料型別 [列級別約束條件] [預設值],
    列名2,資料型別 [列級別約束條件] [預設值],
    ……
    [表級別約束條件]
    );

使用CREATE TABLE建立表時,必須指定以下資訊:

  1. 要建立的表的名稱,不區分大小寫,不能使用SQL語言中的關鍵字,如 DROP、ALTER、INSERT等
  2. 資料表中的每一個列(欄位)的名稱和資料型別。如果建立多個列,就要用逗號隔開。

例如:

  • 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語句格式分為兩種情況:

  1. 在定義列的同時指定主鍵,語法規則為:欄位名 資料型別 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)要求該列唯一,允許為空,但只能出現一個空值。唯一約束可以確保一列或者幾列不出現重複值。

唯一性約束的語法規則如下:

  1. 在定義完列之後直接指定唯一約束,語法規則為:欄位名 資料型別 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

UNIQUEPRIMARY KEY的區別:

  1. 一個表中可以有多個欄位宣告為UNIQUE,但是隻能有一個PRIMARY KEY宣告
  2. 宣告為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中,查看錶結構使用DESCRIBESHOW 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>

  1. 使用SHOW CREATE TABLE語句,不僅可以檢視資料表的建立語句,還可以檢視儲存引擎和字元編碼
  2. 如果不加\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 已存在欄位名];

其中:

  • 新欄位名:指需要新增的欄位名稱

FIRSTAFTER 已存在欄位名用於指定新增欄位在表中的位置。如果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)

參考文獻

  1. MySQL 5.7 從零開始學