MySQL重命名錶(RENAME TABLE語句)

在本教程中,您將學習如何使用MySQL RENAME TABLE語句和ALTER TABLE語句來重命名錶。html

MySQL RENAME TABLE語句簡介

因爲業務需求的變化,咱們須要將當前表重命名爲一個新的名稱,以更好地反映新的狀況。MySQL提供了用於修改一個或多個表的名稱的很是有用的語句。mysql

要修改一個或多個表,咱們使用 RENAME TABLE 語句以下:sql

RENAME TABLE old_table_name TO new_table_name;

舊錶( old_table_name)必須存在,而新表( new_table_name)必定不存在。若是新表  new_table_name 確實存在,該語句將失敗。 數據庫

除了表,咱們可使用 RENAME TABLE 語句從新命名視圖安全

咱們執行RENAME TABLE語句以前,必須確保不存在活躍事務或鎖定表。請注意,不能使用 RENAME TABLE 語句重命名一個臨時表,但可使用 ALTER TABLE 語句來重命名一個臨時表。從安全性角度,咱們給予舊錶的任何權限必須手動遷移到新表上。學習

重命名錶以前,應完全評估的影響。例如,應該調查哪些應用程序正在使用這個舊錶。若是確實須要進行更改表的名稱,那麼也要更改對應引用表名的名稱,以及在應用程序代碼中修改表的名稱。此外,還要手動調整其餘數據庫對象,如:視圖存儲過程觸發器外鍵約束等,即參照表。咱們將在下面的實例中進行更詳細討論。spa

MySQL RENAME TABLE示例

首先,咱們建立一個新的數據庫名爲:hr_db,在這個數據庫裏邊建立兩個表:employee 和 department ,其關係及表結構以下 ER 圖所示 -code

CREATE DATABASE IF NOT EXISTS hr_db;
CREATE TABLE hr_db.department(
    department_id INT AUTO_INCREMENT  PRIMARY KEY,
    dept_name VARCHAR(100)
);
 
CREATE TABLE hr_db.employee(
    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 department(department_id)
);

第二步,插入一些樣本數據到 employee 和 department 表:htm

INSERT INTO hr_db.department(dept_name)
VALUES('銷售部'),('市場部'),('技術部'),('會計部'),('倉庫部'),('生產部');
INSERT INTO hr_db.employee(first_name,last_name,department_id)
VALUES('學友','張',1),
('家輝','張',2),
('星星','周',3),
('超','鄧',4),
('志祥','羅',5),
('亦凡','吳',1);

第三,從新查詢 employee 和 department 表中的數據,以下是查詢所示 - 對象

SELECT
    department_id,dept_name
FROM
    hr_db.department;

執行上面SQL查詢,獲得以下結果 - 

SELECT
    id,first_name,last_name,department_id
FROM
    hr_db.employee;

執行上面SQL查詢,獲得以下結果 - 

 

重命名視圖所引用的表

若是要重命名視圖所引用的表,重命名錶成功後,視圖引用的舊錶將變得無效,因此這個時候必須手動調整視圖。

例如,咱們基於 employee 和 department 表建立一個視圖名稱爲 v_employee_info ,以下:

CREATE VIEW v_employee_info as
    SELECT
        id,first_name,last_name,dept_name
    from
        hr_db.employee
            inner join
        hr_db.department USING (department_id);

該視圖使用內部聯接(inner join)子句鏈接 employee 和 department 表。

下面的 SELECT 語句是從 v_employee_info 視圖查詢並返回全部數據。

SELECT
    *
FROM
    v_employee_info;

執行上面SQL查詢,獲得以下結果 - 

如今,咱們再次重命名錶employees 爲 people 並從 v_employee_info 視圖中查詢數據。以下查詢 - 

RENAME TABLE employee TO people;
SELECT
    *
FROM
    v_employee_info;

MySQL將返回如下錯誤信息:

Error Code: 1356. View 'hr_db.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 視圖的狀態以下:

CHECK TABLE v_employee_info;

執行上面SQL查詢,獲得以下結果 - 

咱們須要手動改變 v_employee_info 視圖,以便它引用到 people 表,而不是 employee 表。

 

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

若是要重命名一個表,可是這個表它由存儲過程引用,須要手動做一些相似於視圖引用中所做的調整。

首先,重命名錶 people 爲 employee 。

RENAME TABLE  hr_db.people TO hr_db.employee;

而後,建立一個新的存儲過程名爲 get_employee 並引用 employee表。

DELIMITER $$
 
CREATE PROCEDURE get_employee(IN p_id INT)
 
BEGIN
SELECT first_name , last_name , dept_name
FROM hr_db.employee
INNER JOIN hr_db.department using(department_id)
WHERE id=p_id;
END $$
 
DELIMITER;

接着,咱們執行 get_employee 存儲過程並指定參數:1,查詢得到員工的數據以下:

CALL get_employee(1);

執行上面SQL查詢,獲得以下結果 - 

在這以後,咱們再次重命名錶 employee 爲 people 。以下查詢 - 

RENAME TABLE hr_db.employee TO hr_db.people;

最後,咱們調用 get_employee  存儲過程並指定參數:1,來得到員工的信息,以下查詢 - 

CALL get_employee(2);

MySQL返回如下錯誤信息:

ErrorCode:1146.Table 'hr_db.employees' doesn't  exist

爲了解決這個問題,咱們必須手動在存儲過程更改 employee 表爲 people 。

 

重命名有引用外鍵的表

department表使用 department_id 列鏈接到 employee 表。 在 employee 表中的 department_id 列是外鍵,它引用 department 表。

若是重命名 department 表,全部的指向 department 表的外鍵不會自動更新。在這種狀況下,咱們必須手動刪除並從新建立外鍵。

RENAME TABLE hr_db.department TO hr_db.dept;

咱們刪除ID爲1的部門,由於外鍵約束,在 people 表中全部行也相應地刪除了。可是,咱們重命名 department 表爲 depts 表而不手動更新外鍵,MySQL將返回一個錯誤,以下圖所示:

DELETE FROM  hr_db.dept
WHERE
    department_id=1;
Error Code: 1451. Cannot delete or update a parent row: a foreign key constraint fails (`hr_db`.`people`, CONSTRAINT `people_ibfk_1` FOREIGN KEY (`department_id`) REFERENCES `dept` (`department_id`))

 

重命名多個表

也可使用RENAME TABLE語句,一次重命名多個表。參見下面的語句:

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

下面的語句重命名 people 和 depts 表爲 employee 和 department 表:

RENAME TABLE hr_db.dept TO   hr_db.department,
             hr_db.people  TO  hr_db.employee;

注意:RENAME TABLE 語句不是原子操做。若是發生了任何錯誤,MySQL的執行將回退全部重命名錶到原來的名稱。

 

使用ALTER TABLE語句重命名錶

可使用ALTER TABLE語句重命名錶,以下:

ALTER TABLE old_table_name
RENAME TO new_table_name;

ALTER TABLE 語句能夠重命名一個臨時表,而 RENAME TABLE 語句不能。

 

重命名臨時表的例子

首先,咱們建立一個包含來自 employee 表中的姓氏列惟一的臨時表:

CREATE TEMPORARY TABLE lastnames SELECT DISTINCT last_name from employee;

其次,咱們用 RENAME TABLE 語句重命名 lastnames 表:

RENAME  TABLE lastnames TO unique_lastnames;

MySQL返回如下錯誤信息:

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

第三,使用 ALTER TABLE 語句從新命名 lastnames 表。

ALTER TABLE lastnames
RENAME TO unique_lastnames;

第四,查詢 unique_lastnames 臨時表中的數據:

SELECT
    last_name
FROM
    unique_lastnames;

執行上面的查詢結果,以下所示 - 

在本教程中,咱們已經展現瞭如何使用 MySQL RENAME TABLE 和 ALTER TABLE 語句來重命名錶。

相關文章
相關標籤/搜索