MySQL重命名表(RENAMETABLE语句)
在本教程中,您将学习如何使⽤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 语句重命名⼀个,但可以使
⽤  语句来重命名⼀个临时表。从安全性⾓度,我们给予旧表的任何权限必须⼿动迁移到新表上。
重命名表之前,应彻底评估的影响。例如,应该调查哪些应⽤程序正在使⽤这个旧表。如果确实需要进⾏更改表的名称,那么也要更改对应引⽤表名的名称,以及在应⽤程序代码中修改表的名称。此外,还要⼿动调整其他数据库对象,如:,,,等,即参照表。我们将在下⾯的实例中进⾏更详细讨论。
MySQL RENAME TABLE⽰例
⾸先,我们名为:hr_db,在这个数据库⾥边创建两个表:employee 和 department ,其关系及表结构如下 ER 图所⽰ -
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 ployee(
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 表:
INSERT INTO hr_db.department(dept_name)
VALUES('销售部'),('市场部'),('技术部'),('会计部'),('仓库部'),('⽣产部');
INSERT INTO ployee(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查询,得到如下结果 -
之前下过mysql现在重新下载mysqlSELECT
id,first_name,last_name,department_id
FROM
ployee;
执⾏上⾯SQL查询,得到如下结果 -
重命名视图所引⽤的表
如果要重命名视图所引⽤的表,重命名表成功后,视图引⽤的旧表将变得⽆效,所以这个时候必须⼿动调整视图。
例如,我们基于 employee 和 department 表创建⼀个视图名称为 v_employee_info ,如下:
CREATE VIEW v_employee_info as
SELECT
id,first_name,last_name,dept_name
from
ployee
inner join
hr_db.department USING (department_id);
该视图使⽤内部联接()⼦句连接 employee 和 department 表。
下⾯的 语句是从 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 ployee;
然后,创建⼀个新的存储过程名为 get_employee 并引⽤ employee表。
DELIMITER $$
CREATE PROCEDURE get_employee(IN p_id INT)
BEGIN
SELECT first_name , last_name , dept_name
FROM ployee
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 ployee TO hr_db.people;
最后,我们调⽤ get_employee  存储过程并指定参数:1,来获得员⼯的信息,如下查询 -
CALL get_employee(2);
MySQL返回以下错误信息:
ErrorCode:1146.Table 'ployees' 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 表中所有⾏也相应地删除了。但是,我们重命名 de
partment 表为 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 (
重命名多个表
也可以使⽤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  ployee;
注意: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 语句来重命名表。

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。