Resumo : neste tutorial, você aprenderá como renomear tabelas usando RENAME TABLE
instruções e ALTER TABLE
instruções MySQL.
Introdução à instrução MySQL RENAME TABLE
Devido à evolução dos requisitos de negócios, é necessário renomear a tabela existente para alinhá-la melhor com a nova situação. MySQL oferece uma instrução valiosa para renomear uma ou mais tabelas.
Para renomear uma ou mais tabelas, você pode usar a RENAME TABLE
seguinte instrução:
RENAME TABLE table_name
TO new_table_name;
Linguagem de código: SQL (linguagem de consulta estruturada) ( sql )
Nesta sintaxe:
table_name
: este é o nome da tabela que você deseja renomear.new_table_name
: Este é o novo nome da tabela.
A tabela com o table_name
deve existir ou a RENAME
instrução falhará com um erro.
Ao executar a RENAME TABLE
instrução, você precisa garantir que não haja transações ativas ou tabelas bloqueadas .
Observe que você não pode usar a RENAME TABLE
instrução para renomear uma tabela temporária , mas pode usar a instrução ALTER TABLE para renomear uma tabela temporária.
Em termos de segurança, quaisquer privilégios existentes concedidos à tabela antiga devem ser migrados manualmente para a nova tabela.
Antes de renomear uma tabela, é importante avaliar minuciosamente o impacto potencial.
Por exemplo, você deve investigar quais aplicativos estão usando a tabela atualmente. A alteração do nome da tabela exigiria alterações correspondentes no código do aplicativo que a faz referência.
Além disso, você precisará ajustar manualmente outros objetos do banco de dados, incluindo visualizações , procedimentos armazenados , gatilhos e restrições de chave estrangeira que fazem referência à tabela.
Iremos nos aprofundar nisso com mais detalhes nos exemplos a seguir.
Exemplos de MySQL RENAME TABLE
Primeiro, crie um novo banco de dados chamado hr
que inclua duas tabelas: employees
e departments
para demonstração.
CREATE DATABASE IF NOT EXISTS hr;
Linguagem de código: SQL (linguagem de consulta estruturada) ( sql )
CREATE TABLE departments (
department_id INT AUTO_INCREMENT PRIMARY KEY,
dept_name VARCHAR(100) NOT NULL
);
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)
);
Linguagem de código: SQL (linguagem de consulta estruturada) ( sql )
Segundo, insira dados de amostra nas tabelas employees
e departments
:
INSERT INTO departments(dept_name)
VALUES
('Sales'),
('Markting'),
('Finance'),
('Accounting'),
('Warehouses'),
('Production');
Linguagem de código: SQL (linguagem de consulta estruturada) ( sql )
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);
Linguagem de código: JavaScript ( javascript )
Terceiro, consulte os dados das tabelas departments
e employees
:
SELECT
department_id, dept_name
FROM
departments;
Linguagem de código: SQL (linguagem de consulta estruturada) ( sql )
SELECT
id, first_name, last_name, department_id
FROM
employees;
Linguagem de código: SQL (linguagem de consulta estruturada) ( sql )
1) Renomeando uma tabela referenciada por uma visualização
Se a tabela que você vai renomear for referenciada por uma view , a view se tornará inválida e você terá que ajustá-la manualmente.
Por exemplo, criamos uma visualização nomeada v_employee_info
com base nas tabelas employees
e departments
da seguinte forma:
CREATE VIEW v_employee_info as
SELECT
id,
first_name,
last_name,
dept_name
from
employees
inner join departments USING (department_id);
Linguagem de código: SQL (linguagem de consulta estruturada) ( sql )
As visualizações usam a cláusula de junção interna para unir departments
tabelas employees
.
A instrução SELECT a seguir retorna todos os dados da v_employee_info
visualização.
SELECT * FROM v_employee_info;
Linguagem de código: SQL (linguagem de consulta estruturada) ( sql )
Agora renomeamos a tabela employees
to people
e consultamos os dados da v_employee_info
visualização novamente.
RENAME TABLE employees TO people;
Linguagem de código: SQL (linguagem de consulta estruturada) ( sql )
SELECT * FROM v_employee_info;
Linguagem de código: SQL (linguagem de consulta estruturada) ( sql )
MySQL retorna a seguinte mensagem de erro:
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
Linguagem de código: SQL (linguagem de consulta estruturada) ( sql )
Podemos usar a CHECK TABLE
instrução para verificar o status da v_employee_info
visualização da seguinte maneira:
CHECK TABLE v_employee_info;
Linguagem de código: SQL (linguagem de consulta estruturada) ( sql )
Precisamos alterar manualmente a v_employee_info
visualização para que ela se refira à people
tabela em vez da employees
tabela.
2) Renomeando uma tabela referenciada por um procedimento armazenado
Caso a tabela que você vai renomear seja referenciada por um procedimento armazenado , você deverá ajustá-la manualmente como fez com a visualização.
Primeiro, renomeie a people
tabela de volta para employees
tabela.
RENAME TABLE people TO employees;
Linguagem de código: SQL (linguagem de consulta estruturada) ( sql )
Em seguida, crie um novo procedimento armazenado denominado get_employee
que se refira à employees
tabela.
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 ;
Linguagem de código: SQL (linguagem de consulta estruturada) ( sql )
A seguir, execute a get_employee
tabela para obter os dados do funcionário com ID 1 da seguinte forma:
CALL get_employee(1);
Linguagem de código: SQL (linguagem de consulta estruturada) ( sql )
Depois disso, renomeie employees
para a people
tabela novamente.
RENAME TABLE employees TO people;
Linguagem de código: SQL (linguagem de consulta estruturada) ( sql )
Por fim, chame o get_employee
procedimento armazenado para obter as informações do funcionário com o ID 2:
CALL get_employee(2);
Linguagem de código: SQL (linguagem de consulta estruturada) ( sql )
MySQL retorna a seguinte mensagem de erro:
Error Code: 1146. Table 'hr.employees' doesn't exist
Linguagem de código: SQL (linguagem de consulta estruturada) ( sql )
Para corrigir isso, você precisa alterar manualmente a employees
tabela no procedimento armazenado para people
tabela.
3) Renomear uma tabela referenciada por restrições de chave estrangeira
A departments
tabela é vinculada à employees
tabela usando a department_id
coluna.
A department_i
coluna d da employees
tabela é a chave estrangeira que faz referência à departments
tabela.
Se você renomear a departments
tabela, todas as chaves estrangeiras que fazem referência à departments
tabela não serão atualizadas automaticamente. Nesses casos, você deve eliminar e recriar as chaves estrangeiras manualmente.
RENAME TABLE departments TO depts;
Linguagem de código: SQL (linguagem de consulta estruturada) ( sql )
Excluímos um departamento com id 1, devido à restrição de chave estrangeira, todas as linhas da people
tabela também devem ser excluídas.
Porém, renomeamos a departments
tabela para depts
tabela sem atualizar a chave estrangeira manualmente, o MySQL retorna um erro conforme ilustrado abaixo:
DELETE FROM depts
WHERE
department_id = 1
Linguagem de código: SQL (linguagem de consulta estruturada) ( sql )
Saída:
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`))
Linguagem de código: JavaScript ( javascript )
Renomeando várias tabelas
Também podemos usar a RENAME TABLE
instrução para renomear várias tabelas ao mesmo tempo. Veja a seguinte declaração:
RENAME TABLE
table_name1 TO new_table_name1,
table_name2 TO new_table_name2,
...;
Linguagem de código: SQL (linguagem de consulta estruturada) ( sql )
A instrução a seguir renomeia as tabelas people
e depts
para tabelas employees
e departments
:
RENAME TABLE depts TO departments,
people TO employees;
Linguagem de código: SQL (linguagem de consulta estruturada) ( sql )
Observe que a RENAME TABLE
declaração não é atômica. Isso significa que se ocorrer algum erro, o MySQL executa um rollback de todas as tabelas renomeadas para seus nomes antigos.
Renomeando tabelas usando a instrução ALTER TABLE
Você pode renomear uma tabela usando a ALTER TABLE
seguinte instrução:
ALTER TABLE old_table_name
RENAME TO new_table_name;
Linguagem de código: SQL (linguagem de consulta estruturada) ( sql )
A ALTER TABLE
instrução pode renomear uma tabela temporária, mas a RENAME TABLE
instrução não.
Exemplo de renomeação de tabela temporária
Primeiro, crie uma tabela temporária que contenha todos os sobrenomes exclusivos provenientes da last_name
coluna da employees
tabela:
CREATE TEMPORARY TABLE lastnames
SELECT DISTINCT last_name from employees;
Linguagem de código: SQL (linguagem de consulta estruturada) ( sql )
Segundo, use o RENAME TABLE
para renomear a lastnames
tabela:
RENAME TABLE lastnames TO unique_lastnames;
Linguagem de código: SQL (linguagem de consulta estruturada) ( sql )
MySQL retorna a seguinte mensagem de erro:
Error Code: 1017. Can't find file: '.\hr\lastnames.frm' (errno: 2 - No such file or directory)
Linguagem de código: SQL (linguagem de consulta estruturada) ( sql )
Terceiro, use a ALTER TABLE
instrução para renomear a lastnames
tabela.
ALTER TABLE lastnames
RENAME TO unique_lastnames;
Linguagem de código: SQL (linguagem de consulta estruturada) ( sql )
Quarto, consulte os dados da unique_lastnames
tabela temporária:
SELECT
last_name
FROM
unique_lastnames;
Linguagem de código: SQL (linguagem de consulta estruturada) ( sql )
Resumo
- Use a instrução
RENAME TABLE
ouALTER TABLE
para renomear uma tabela.