Instrução MySQL RENAME TABLE

Resumo : neste tutorial, você aprenderá como renomear tabelas usando RENAME TABLEinstruções e ALTER TABLEinstruçõ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 TABLEseguinte 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_namedeve existir ou a RENAMEinstrução falhará com um erro.

Ao executar a RENAME TABLEinstrução, você precisa garantir que não haja transações ativas ou tabelas bloqueadas .

Observe que você não pode usar a RENAME TABLEinstruçã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 hrque inclua duas tabelas: employeese departmentspara demonstração.

Banco de dados de amostra de RH
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 employeese 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 departmentse employees:

SELECT 
    department_id, dept_name
FROM
    departments;Linguagem de código:  SQL (linguagem de consulta estruturada)  ( sql )
Tabela de departamentos MySQL RENAME TABLE
SELECT 
    id, first_name, last_name, department_id
FROM
    employees;Linguagem de código:  SQL (linguagem de consulta estruturada)  ( sql )
Tabela de funcionários MySQL RENAME TABLE

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_infocom base nas tabelas employeese departmentsda 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 departmentstabelas employees.

A instrução SELECT a seguir retorna todos os dados da v_employee_infovisualização.

SELECT * FROM v_employee_info;Linguagem de código:  SQL (linguagem de consulta estruturada)  ( sql )
MySQL RENAME TABLE com exemplo de visualização

Agora renomeamos a tabela employeesto peoplee consultamos os dados da v_employee_infovisualizaçã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 themLinguagem de código:  SQL (linguagem de consulta estruturada)  ( sql )

Podemos usar a CHECK TABLEinstrução para verificar o status da v_employee_infovisualização da seguinte maneira:

CHECK TABLE v_employee_info;Linguagem de código:  SQL (linguagem de consulta estruturada)  ( sql )
TABELA DE VERIFICAÇÃO MySQL

Precisamos alterar manualmente a v_employee_info visualização para que ela se refira à peopletabela em vez da employeestabela.

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  employeestabela.

RENAME TABLE people TO employees;Linguagem de código:  SQL (linguagem de consulta estruturada)  ( sql )

Em seguida, crie um novo procedimento armazenado denominado get_employeeque se refira à employeestabela.

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_employeetabela 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 )
MySQL RENAME TABLE com procedimento armazenado

Depois disso, renomeie employeespara a peopletabela novamente.

RENAME TABLE employees TO people;Linguagem de código:  SQL (linguagem de consulta estruturada)  ( sql )

Por fim, chame o get_employeeprocedimento 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 existLinguagem de código:  SQL (linguagem de consulta estruturada)  ( sql )

Para corrigir isso, você precisa alterar manualmente a employeestabela no procedimento armazenado para peopletabela.

3) Renomear uma tabela referenciada por restrições de chave estrangeira

A departmentstabela é vinculada à employeestabela usando a department_idcoluna.

A department_icoluna d da employees tabela é a chave estrangeira que faz referência à departmentstabela.

Se você renomear a departmentstabela, 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 peopletabela também devem ser excluídas.

Porém, renomeamos a departmentstabela para deptstabela sem atualizar a chave estrangeira manualmente, o MySQL retorna um erro conforme ilustrado abaixo:

DELETE FROM depts 
WHERE
    department_id = 1Linguagem 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 TABLEinstruçã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 peoplee deptspara tabelas employeese 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 TABLEseguinte instrução:

ALTER TABLE old_table_name
RENAME TO new_table_name;Linguagem de código:  SQL (linguagem de consulta estruturada)  ( sql )

A ALTER TABLEinstrução pode renomear uma tabela temporária, mas a RENAME TABLEinstruçã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_namecoluna da employeestabela:

CREATE TEMPORARY TABLE lastnames
SELECT DISTINCT last_name from employees;Linguagem de código:  SQL (linguagem de consulta estruturada)  ( sql )

Segundo, use o RENAME TABLEpara renomear a lastnamestabela:

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 lastnamestabela.

ALTER TABLE lastnames
RENAME TO unique_lastnames;Linguagem de código:  SQL (linguagem de consulta estruturada)  ( sql )

Quarto, consulte os dados da unique_lastnamestabela temporária:

SELECT 
    last_name
FROM
    unique_lastnames;Linguagem de código:  SQL (linguagem de consulta estruturada)  ( sql )
MySQL ALTER TABLE renomeia tabela temporária

Resumo

  • Use a instrução RENAME TABLEou ALTER TABLEpara renomear uma tabela.

Deixe um comentário

O seu endereço de email não será publicado. Campos obrigatórios marcados com *