如何使用MySQL RENAME TABLE语句重命名表
简介:在本教程中,您将学习如何使用MySQL RENAME TABLE语句和ALTER TABLE语句重命名表。
MySQL RENAME TABLE语句简介
由于业务需求发生变化,因此我们需要将当前表重命名为新表,以更好地反映新情况。
MySQL为我们提供了一个非常有用的语句,它可以更改一个或多个表的名称。
要更改一个或多个表,我们使用RENAME TABLE语句,如下所示:
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语句重命名临时表。
在安全性方面,我们授予旧表的所有现有特权都必须手动迁移到新表。
重命名表之前,您应该彻底评估影响。
例如,您应该调查哪些应用程序正在使用该表。
如果表名更改,那么引用表名的应用程序代码也需要更改。
另外,您必须手动调整对表的引用的其他数据库对象,例如视图,存储过程,触发器,外键约束等。
我们将在以下示例中对此进行更详细的讨论。
MySQL重命名表示例
首先,我们创建一个名为hr的新数据库,该数据库包含两个表:演示的员工和部门。
CREATE DATABASE IF NOT EXISTS hr;
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) );
其次,我们将示例数据插入到employee和departments表中:
INSERT INTO departments(dept_name) VALUES('Sales'),('Markting'),('Finance'),('Accounting'),('Warehouses'),('Production');
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);
第三,我们在部门和雇员表中查看我们的数据:
SELECT department_id, dept_name FROM departments;
SELECT id, first_name, last_name, department_id FROM employees;
重命名视图引用的表
如果视图要引用要重命名的表,则重命名该表后该视图将无效,并且必须手动调整该视图。
例如,我们基于雇员和部门表创建一个名为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);
这些视图使用内部联接子句联接部门和雇员表。
以下SELECT语句从v_employee_info视图返回所有数据。
SELECT * FROM v_employee_info;
现在,我们将雇员重命名为人员表,并再次从v_employee_info视图中查询数据。
RENAME TABLE employees TO people;
SELECT * FROM v_employee_info;
MySQL返回以下错误消息:
Error Code: 1356. View 'hr.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;
我们需要手动更改v_employee_info视图,以便它引用人员表而不是雇员表。
重命名存储过程引用的表
如果要重命名的表被存储过程引用,则必须像对视图一样手动进行调整。
首先,将人员表重命名为``员工''表。
RENAME TABLE people TO employees;
然后,创建一个新的名为get_employee的存储过程,该存储过程引用了employee表。
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;
接下来,我们执行get_employee表以获取ID为1的员工的数据,如下所示:
CALL get_employee(1);
之后,我们再次将雇员重命名为人员表。
RENAME TABLE employees TO people;
最后,我们调用get_employee存储过程来获取ID为2的雇员的信息:
CALL get_employee(2);
MySQL返回以下错误消息:
Error Code: 1146. Table 'hr.employees' doesn't exist
要解决此问题,我们必须手动将存储过程中的employee表更改为people表。
重命名引用了外键的表
部门表使用department_id列链接到员工表。
雇员表中的department_id列是引用部门表的外键。
如果我们重命名部门表,则指向部门表的所有外键将不会自动更新。
在这种情况下,我们必须手动删除并重新创建外键。
RENAME TABLE departments TO depts;
由于外键约束,我们将删除ID为1的部门,因此人员表中的所有行也应删除。
但是,我们没有手动更新外键就将Departments表重命名为depts表,MySQL返回错误,如下所示:
DELETE FROM depts WHERE department_id = 1;
Error Code: 1451. Cannot delete or update a parent row: a foreign key constraint fails (`hr`.`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,...
以下语句将人员表和部门表重命名为员工表和部门表:
RENAME TABLE depts TO departments, people TO employees;
注意RENAME TABLE声明不是原子的。
这意味着如果发生任何错误,MySQL会将所有重命名的表还原为旧名称。
使用ALTER TABLE语句重命名表
我们可以使用ALTER TABLE语句重命名表,如下所示:
ALTER TABLE old_table_name RENAME TO new_table_name;
ALTER TABLE语句可以重命名临时表,而RENAME TABLE语句不能。
重命名临时表示例
首先,我们创建一个临时表,其中包含所有来自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: '.\hr\lastnames.frm' (errno: 2 - No such file or directory)
第三,我们使用ALTER TABLE语句重命名姓氏表。
ALTER TABLE lastnames RENAME TO unique_lastnames;
第四,我们从unique_lastnames临时表中查询数据:
SELECT last_name FROM unique_lastnames;
在本教程中,我们向您展示了如何使用MySQL RENAME TABLE和ALTER TABLE语句重命名表。