在线观看不卡亚洲电影_亚洲妓女99综合网_91青青青亚洲娱乐在线观看_日韩无码高清综合久久

鍍金池/ 教程/ 數(shù)據(jù)庫/ MySQL重命名表
MySQL+Node.js連接和操作
MySQL刪除表數(shù)據(jù)
http://www.yiibai.com/mysql/triggers.html
MySQL是什么?
MySQL插入數(shù)據(jù)
MySQL是什么?
MySQL全文搜索
MySQL數(shù)據(jù)庫服務(wù)器安裝
MySQL創(chuàng)建表
MySQL導(dǎo)入示例數(shù)據(jù)庫
MySQL教程
MySQL函數(shù)
MySQL管理
MySQL WHERE語句
MySQL存儲過程
MySQL技巧
MySQL觸發(fā)器
MySQL示例數(shù)據(jù)庫
MySQL重命名表
MySQL數(shù)據(jù)類型
MySQL創(chuàng)建與刪除數(shù)據(jù)庫
MySQL更新表數(shù)據(jù)
MySQL快速學(xué)習(xí)入門
MySQL安裝
MySQL快速入門
MySQL視圖
http://www.yiibai.com/mysql/mysqltips.html
MySQL修改表結(jié)構(gòu)
MySQL基礎(chǔ)教程
MySQL+Python連接和操作
http://www.yiibai.com/mysql/basic-mysql.html
MySQL查詢數(shù)據(jù)
http://www.yiibai.com/mysql/views.html
http://www.yiibai.com/mysql/full-text-search.html
下載本MySQL教程的示例數(shù)據(jù)庫(其中包函表和示例數(shù)據(jù))
http://www.yiibai.com/mysql/stored-procedure.html

MySQL重命名表

在本教程中,您將學(xué)習(xí)如何使用MySQL RENAME TABLE語句和ALTER TABLE語句重命名表。

MySQL RENAME TABLE語句簡介

由于業(yè)務(wù)需求變化,我們需要將當(dāng)前表重新命名為新表,以更好地反映或表示新情況。 MySQL提供了一個非常有用的語句來更改一個或多個表的名稱。

要更改一個或多個表,我們使用RENAME TABLE語句如下:

RENAME TABLE old_table_name TO new_table_name;

舊表(old_table_name)必須存在,新表(new_table_name)必須不存在。 如果新表new_table_name存在,則該語句將失敗。

除了表之外,我們還可以使用RENAME TABLE語句來重命名視圖

在執(zhí)行RENAME TABLE語句之前,必須確保沒有活動事務(wù)或鎖定表

請注意,不能使用RENAME TABLE語句來重命名臨時表,但可以使用ALTER TABLE語句重命名臨時表。

在安全性方面,我們授予舊表的任何權(quán)限必須手動遷移到新表。

在重命名表之前,應(yīng)該徹底地評估影響。 例如,應(yīng)該調(diào)查哪些應(yīng)用程序正在使用該表。 如果表的名稱更改,那么引用表名的應(yīng)用程序代碼也需要更改。 此外,您必須手動調(diào)整引用該表的其他數(shù)據(jù)庫對象,如視圖,存儲過程,觸發(fā)器外鍵約束等。 我們將在下面的例子中更詳細(xì)地討論。

MySQL RENAME TABLE示例

首先,我們創(chuàng)建一個名為hrdb的新數(shù)據(jù)庫,它由兩個表組成:employeesdepartments。

創(chuàng)建數(shù)據(jù)庫 -

CREATE DATABASE IF NOT EXISTS hrdb;

創(chuàng)建表 -

USE hrdb;

CREATE TABLE departments (
    department_id INT AUTO_INCREMENT PRIMARY KEY,
    dept_name VARCHAR(100)
);

CREATE TABLE employees (
    id int AUTO_INCREMENT primary key,
    first_name varchar(50) not null,
    last_name varchar(50) not null,
    department_id int not null,
    FOREIGN KEY (department_id)
        REFERENCES departments (department_id)
);

其次,將樣本數(shù)據(jù)插入到 employeesdepartments 表中:

-- 插入數(shù)據(jù)到 departments 表中
INSERT INTO departments(dept_name)
VALUES('Sales'),('Markting'),('Finance'),('Accounting'),('Warehouses'),('Production');

-- 插入數(shù)據(jù)到 employees 表中
INSERT INTO employees(first_name,last_name,department_id) 
VALUES('John','Doe',1),
 ('Bush','Lily',2),
 ('David','Dave',3),
 ('Mary','Jane',4),
 ('Jonatha','Josh',5),
 ('Mateo','More',1);

第三,查詢在 employeesdepartments 表中的數(shù)據(jù):

mysql> SELECT 
    department_id, dept_name
FROM
    departments;
+---------------+------------+
| department_id | dept_name  |
+---------------+------------+
|             1 | Sales      |
|             2 | Markting   |
|             3 | Finance    |
|             4 | Accounting |
|             5 | Warehouses |
|             6 | Production |
+---------------+------------+
6 rows in set

mysql> SELECT 
    id, first_name, last_name, department_id
FROM
    employees;
+----+------------+-----------+---------------+
| id | first_name | last_name | department_id |
+----+------------+-----------+---------------+
|  1 | John       | Doe       |             1 |
|  2 | Bush       | Lily      |             2 |
|  3 | David      | Dave      |             3 |
|  4 | Mary       | Jane      |             4 |
|  5 | Jonatha    | Josh      |             5 |
|  6 | Mateo      | More      |             1 |
+----+------------+-----------+---------------+
6 rows in set

重命名視圖引用的表

如果重命名一個被視圖引用的表,在重命名表后,視圖就無效了,并且必須手動調(diào)整視圖。

例如,我們基于employeesdepartments表創(chuàng)建一個名為v_employee_info的視圖,如下所示:

CREATE VIEW v_employee_info as
    SELECT 
        id, first_name, last_name, dept_name
    from
        employees
            inner join
        departments USING (department_id);

視圖使用內(nèi)連接子句來連接employeesdepartments表。

以下SELECT語句返回v_employee_info視圖中的所有數(shù)據(jù)。

mysql> SELECT 
    *
FROM
    v_employee_info;
+----+------------+-----------+------------+
| id | first_name | last_name | dept_name  |
+----+------------+-----------+------------+
|  1 | John       | Doe       | Sales      |
|  2 | Bush       | Lily      | Markting   |
|  3 | David      | Dave      | Finance    |
|  4 | Mary       | Jane      | Accounting |
|  5 | Jonatha    | Josh      | Warehouses |
|  6 | Mateo      | More      | Sales      |
+----+------------+-----------+------------+
6 rows in set

現(xiàn)在,將v_employee_info視圖中的employees表重命名為people,并查詢視圖的數(shù)據(jù)。

RENAME TABLE employees TO people;

-- 查詢數(shù)據(jù)
SELECT 
    *
FROM
    v_employee_info;

MySQL返回以下錯誤消息:

1356 - View 'hrdb.v_employee_info' references invalid table(s) or column(s) or function(s) or definer/invoker of view lack rights to use them

我們可以使用CHECK TABLE語句來檢查v_employee_info視圖的狀態(tài)如下:

CHECK TABLE v_employee_info;
mysql> CHECK TABLE v_employee_info;
+----------------------+-------+----------+----------------------------------------------------------------------------------------------------------------------------------------+
| Table                | Op    | Msg_type | Msg_text                                                                                                                               |
+----------------------+-------+----------+----------------------------------------------------------------------------------------------------------------------------------------+
| hrdb.v_employee_info | check | Error    | Table 'hrdb.employees' doesn't exist                                                                                                   |
| hrdb.v_employee_info | check | Error    | View 'hrdb.v_employee_info' references invalid table(s) or column(s) or function(s) or definer/invoker of view lack rights to use them |
| hrdb.v_employee_info | check | error    | Corrupt                                                                                                                                |
+----------------------+-------+----------+----------------------------------------------------------------------------------------------------------------------------------------+
3 rows in set

需要手動更改v_employee_info視圖,以便它引用people表而不是employees表。

重命名由存儲過程引用的表

如果要重命名由存儲過程引用的表,則必須像對視圖一樣進(jìn)行手動調(diào)整。

首先,將people表重命名為employees表。

RENAME TABLE people TO employees;

然后,創(chuàng)建一個名為get_employee的新存儲過程,該過程引用employees表。

DELIMITER $$

CREATE PROCEDURE get_employee(IN p_id INT)

BEGIN
 SELECT first_name
 ,last_name
 ,dept_name
 FROM employees
 INNER JOIN departments using (department_id)
 WHERE id = p_id;
END $$

DELIMITER;

接下來,執(zhí)行get_employee存儲過程從employees表來獲取id1的員工的數(shù)據(jù),如下所示:

CALL get_employee(1);

執(zhí)行上面查詢語句,得到以下結(jié)果 -

mysql> CALL get_employee(1);
+------------+-----------+-----------+
| first_name | last_name | dept_name |
+------------+-----------+-----------+
| John       | Doe       | Sales     |
+------------+-----------+-----------+
1 row in set

Query OK, 0 rows affected

之后,我們再次將employees表重新命名為people表。

RENAME TABLE employees TO people;

最后,調(diào)用get_employee存儲過程來獲取id2的員工信息:

CALL get_employee(2);

MySQL返回以下錯誤消息:

1146 - Table 'hrdb.employees' doesn't exist

要解決這個問題,我們必須手動將存儲過程中的employees表更改為people表。

重命名引用外鍵的表

departments表使用department_id列鏈接到employees表。 employees表中的department_id列是引用departments表的department_id列作為外鍵

如果重命名departments表,那么指向departments表的所有外鍵都不會被自動更新。 在這種情況下,我們必須手動刪除并重新創(chuàng)建外鍵。

RENAME TABLE departments TO depts;

我們刪除ID1的部門,由于外鍵約束,people表中的所有行也應(yīng)刪除。 但是,我們將department表重命名為depts表,而不會手動更新外鍵,MySQL會返回錯誤,如下所示:

DELETE FROM depts 
WHERE
    department_id = 1;

執(zhí)行上面語句,得到以下以下錯誤提示 -

1451 - Cannot delete or update a parent row: a foreign key constraint fails (`hrdb`.`people`, CONSTRAINT `people_ibfk_1` FOREIGN KEY (`department_id`) REFERENCES `depts` (`department_id`))

重命名多個表

也可以使用RENAME TABLE語句來一次重命名多個表。 見下列聲明:

RENAME TABLE old_table_name_1 TO new_table_name_2,
             old_table_name_2 TO new_table_name_2,...

以下語句將 peopledepts 重命名為 employeesdepartments 表:

RENAME TABLE depts TO departments,
             people TO employees;

注意RENAME TABLE語句不是原子的。所以如果在任何時候發(fā)生錯誤,MySQL會將所有重新命名的表都回滾到舊名稱。

使用ALTER TABLE語句重命名表

我們可以使用ALTER TABLE語句重命名一個表,如下所示:

ALTER TABLE old_table_name
RENAME TO new_table_name;

RENAME TABLE語句不能用于重命名臨時表,這時就可以使用ALTER TABLE語句來重命名一個臨時表。

重命名臨時表示例

首先,我們創(chuàng)建一個臨時表,其中包含來自employees表的last_name列的所有唯一的姓氏:

CREATE TEMPORARY TABLE lastnames
SELECT DISTINCT last_name from employees;

第二步,使用RENAME TABLE重命名姓氏表:

RENAME TABLE lastnames TO unique_lastnames;

MySQL返回以下錯誤消息:

Error Code: 1017. Can't find file: '.\hrdb\lastnames.frm' (errno: 2 - No such file or directory)

第三,使用ALTER TABLE語句來重命名姓氏表。

ALTER TABLE lastnames
RENAME TO unique_lastnames;

第四,從unique_lastnames臨時表查詢數(shù)據(jù):

SELECT 
    last_name
FROM
    unique_lastnames;

+-----------+
| last_name |
+-----------+
| Doe       |
| Lily      |
| Dave      |
| Jane      |
| Josh      |
| More      |
+-----------+
6 rows in set

在本教程中,我們向您展示了如何使用MySQL RENAME TABLEALTER TABLE語句重命名表。


上一篇:MySQL是什么?下一篇:MySQL快速入門