在本教程中,您將學習如何使用MySQL RENAME TABLE語句和ALTER TABLE語句來重命名錶。html
因爲業務需求的變化,咱們須要將當前表重命名爲一個新的名稱,以更好地反映新的狀況。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
首先,咱們建立一個新的數據庫名爲: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 語句來重命名錶。