テーブルの名前を変更するのMySQL

このチュートリアルでは、MySQLの使用方法を学びますRENAME TABLE声明やALTER TABLEテーブルの名前を変更する声明を。

MySQLのRENAME TABLE文の紹介

ビジネス・ニーズの変化に応じて、私たちはより良い新しい状況を反映するか、表現するために、新しいテーブルに現在のテーブルの名前を変更する必要があります。MySQLは1つまたは複数のテーブルの名前を変更するには非常に便利な声明を提供します。

1つまたは複数のテーブルを変更するために、我々は、使用RENAME TABLE、次のように声明を:

RENAME TABLE old_table_name TO new_table_name;
SQL

旧テーブル(old_table_name)(、新しいテーブルを存在している必要がありますがnew_table_name)しません。新しいテーブルが場合new_table_name存在し、ステートメントが失敗します。

テーブルに加えて、我々はまた、使用することができますRENAME TABLE名前を変更する文を表示します

実行中のRENAME TABLE文の前に、あなたは何の活動や取引があることを確認する必要がありますテーブルをロックしていません

ノートは、あなたが使用できないことをしてくださいRENAME TABLE名前を変更するステートメントを、一時テーブルをしますが、使用することができますALTER TABLE文を一時テーブルの名前を変更します。

セキュリティの面では、我々は古いテーブルを許可任意の権限が手動で新しいテーブルに移行する必要があります。

テーブルの名前を変更する前に、徹底的に与える影響を評価すべきです。たとえば、アプリケーションがテーブルを使用しているか調査する必要があります。あなたは、テーブルの名前を変更する場合は、テーブル名参照アプリケーションコードも変更する必要があります。手動での参照は、他のデータベーステーブルは、そのようなオブジェクトを調整する必要がありますビューストアドプロシージャトリガ外部キー制約などを。私たちは、以下の実施例でより詳細に説明します。

MySQLのRENAME TABLEの例

まず、我々は、名前のファイルを作成hrdb2つのテーブルで構成され、新しいデータベースを、:employeesdepartments

データベースを作成します -

CREATE DATABASE IF NOT EXISTS hrdb; 
SQL

テーブルを作成します -

USE hrdb;

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) ); 
SQL

次に、サンプルにデータemployeesdepartmentsテーブル:

-- 插入数据到 departments 表中
INSERT INTO departments(dept_name) VALUES('Sales'),('Markting'),('Finance'),('Accounting'),('Warehouses'),('Production'); -- 插入数据到 employees 表中 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); 
SQL

第三に、クエリemployeesdepartmentsテーブルのデータ:

mysql> SELECT 
    department_id, dept_name
FROM
    departments; +---------------+------------+ | department_id | dept_name | +---------------+------------+ | 1 | Sales | | 2 | Markting | | 3 | Finance | | 4 | Accounting | | 5 | Warehouses | | 6 | Production | +---------------+------------+ 6 rows in set mysql> SELECT id, first_name, last_name, department_id FROM employees; +----+------------+-----------+---------------+ | id | first_name | last_name | department_id | +----+------------+-----------+---------------+ | 1 | John | Doe | 1 | | 2 | Bush | Lily | 2 | | 3 | David | Dave | 3 | | 4 | Mary | Jane | 4 | | 5 | Jonatha | Josh | 5 | | 6 | Mateo | More | 1 | +----+------------+-----------+---------------+ 6 rows in set 
SQL

参照されるテーブルビューの名前を変更します

名前の変更がある場合の表示テーブル参照、リネーム表の後に、ビューは無効になり、手動で視野を調整する必要があります。

例えば、我々はベースemployeesdepartmentsテーブルは、名前の作成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); 
SQL

使用の表示コネクタ接続句employeesdepartmentsテーブル。

のSELECTステートメントは、返すv_employee_infoデータビューのすべてを。

mysql> SELECT 
    *
FROM
    v_employee_info; +----+------------+-----------+------------+ | id | first_name | last_name | dept_name | +----+------------+-----------+------------+ | 1 | John | Doe | Sales | | 2 | Bush | Lily | Markting | | 3 | David | Dave | Finance | | 4 | Mary | Jane | Accounting | | 5 | Jonatha | Josh | Warehouses | | 6 | Mateo | More | Sales | +----+------------+-----------+------------+ 6 rows in set 
SQL

さて、v_employee_infoビューは、employeesテーブルの名前を変更peopleし、データビューを問い合せます。

RENAME TABLE employees TO people;

-- 查询数据 SELECT * FROM v_employee_info; 
SQL

MySQLは、次のエラーメッセージを返します。

1356 - View 'hrdb.v_employee_info' references invalid table(s) or column(s) or function(s) or definer/invoker of view lack rights to use them 
SQL

我々は使用することができますCHECK TABLEチェックする文をv_employee_info、次のような状態のビューを:

CHECK TABLE v_employee_info;
mysql> CHECK TABLE v_employee_info; +----------------------+-------+----------+----------------------------------------------------------------------------------------------------------------------------------------+ | Table | Op | Msg_type | Msg_text | +----------------------+-------+----------+----------------------------------------------------------------------------------------------------------------------------------------+ | hrdb.v_employee_info | check | Error | Table 'hrdb.employees' doesn't exist | | hrdb.v_employee_info | check | Error | View 'hrdb.v_employee_info' references invalid table(s) or column(s) or function(s) or definer/invoker of view lack rights to use them | | hrdb.v_employee_info | check | error | Corrupt | +----------------------+-------+----------+----------------------------------------------------------------------------------------------------------------------------------------+ 3 rows in set 
SQL

手動で変更する必要がありv_employee_info、それが参照するようにビューをpeople代わりにテーブルをemployeesテーブル。

ストアドプロシージャによって参照される名前の変更テーブル

名前を変更するストアドプロシージャ参照テーブルを、手動で同じ画像を表示するために調整されなければなりません。

まず、peopleにテーブルの名前を変更するemployeesテーブル。

RENAME TABLE people TO employees;
SQL

その後、名前のファイルを作成get_employee新しいストアドプロシージャ、プロセス参照employeesテーブルを。

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; 
SQL

次に、get_employeeからストアドプロシージャemployeesテーブル取得id1従業員データを、次のように

CALL get_employee(1); 
SQL

上記のクエリの実装、次の結果 -

mysql> CALL get_employee(1); +------------+-----------+-----------+ | first_name | last_name | dept_name | +------------+-----------+-----------+ | John | Doe | Sales | +------------+-----------+-----------+ 1 row in set Query OK, 0 rows affected 
SQL

その後、我々は再びemployeesテーブルリネームpeopleテーブル。

RENAME TABLE employees TO people;
SQL

最後に、呼び出しget_employee得るために、ストアドプロシージャをidとして2従業員情報:

CALL get_employee(2); 
SQL

MySQLは、次のエラーメッセージを返します。

1146 - Table 'hrdb.employees' doesn't exist
SQL

この問題を解決するために、我々は、手動でストアド・プロシージャ必要がありますemployeesにテーブルを変更するためのpeopleテーブルを。

名前の変更テーブルの外部キー参照

departmentsテーブルの使用department_idにリンクされている列employeesのテーブルを。employeesテーブルdepartment_id列参照departmentsテーブルdepartment_idとしてカラムの外部キー

あなたは、名前を変更した場合departmentsを指して、テーブルをdepartmentsすべての外部キーが自動的に更新されることはありませんテーブル。この場合、我々は、手動で削除して、外部キーを再作成する必要があります。

RENAME TABLE departments TO depts;
SQL

我々は削除IDのために1、外部キー制約ので、部門peopleテーブル内のすべての行も削除する必要があります。しかし、私たちがしますdepartmentし、テーブルの名前を変更しdepts、次のように手動で外部キーを更新せずに、テーブル、MySQLは、エラーを返します:

DELETE FROM depts 
WHERE
    department_id = 1; 
SQL

上記の文の実装は、以下の次のエラーメッセージ -

1451 - Cannot delete or update a parent row: a foreign key constraint fails (`hrdb`.`people`, CONSTRAINT `people_ibfk_1` FOREIGN KEY (`department_id`) REFERENCES `depts` (`department_id`)) 
SQL

複数のテーブルの名前を変更します

また、使用することができRENAME TABLE、一度に複数のテーブルの名前を変更する声明を。次の文を参照してください。

RENAME TABLE old_table_name_1 TO new_table_name_2,
             old_table_name_2 TO new_table_name_2,... 
SQL

次の文peopledepts名前の変更employeesdepartmentsテーブル:

RENAME TABLE depts TO departments,
             people TO employees; 
SQL

ことに注意RENAME TABLE文がアトミックではありません。エラーが任意の時点で発生したのであれば、MySQLはすべてのテーブルが古い名前にロールバックされている名前を変更します。

リネームテーブルにALTER TABLEステートメント

我々は使用することができALTER TABLE、次のように、テーブルの名前を変更する声明を:

ALTER TABLE old_table_name
RENAME TO new_table_name; 
SQL

RENAME TABLE声明では、あなたが使用することができ、一時テーブルの名前を変更するために使用することはできませんALTER TABLE一時テーブルの名前を変更する声明を。

一時的な番組に例の名前を変更します

まず、作成一時テーブルから含まれている、employeesのテーブルlast_nameのすべてのユニークな姓の列を:

CREATE TEMPORARY TABLE lastnames
SELECT DISTINCT last_name from employees; 
SQL

第二のステップ使用して、RENAME TABLEリネームテーブルの姓を:

RENAME TABLE lastnames TO unique_lastnames;
SQL

MySQLは、次のエラーメッセージを返します。

Error Code: 1017. Can't find file: '.\hrdb\lastnames.frm' (errno: 2 - No such file or directory) 
SQL

第三には、使用してALTER TABLEテーブルの姓の名前を変更する声明を。

ALTER TABLE lastnames
RENAME TO unique_lastnames; 
SQL

第四に、からのunique_lastnamesクエリデータの一時表:

SELECT 
    last_name
FROM
    unique_lastnames;

+-----------+ | last_name | +-----------+ | Doe | | Lily | | Dave | | Jane | | Josh | | More | +-----------+ 6 rows in set 
SQL

このチュートリアルでは、MySQLの使用方法をお見せRENAME TABLEしてALTER TABLE、テーブルの名前を変更する声明を。



おすすめ

転載: www.cnblogs.com/borter/p/12452696.html