このチュートリアルでは、MySQLの使用方法を学びますRENAME TABLE
声明やALTER TABLE
テーブルの名前を変更する声明を。
MySQLのRENAME TABLE文の紹介
ビジネス・ニーズの変化に応じて、私たちはより良い新しい状況を反映するか、表現するために、新しいテーブルに現在のテーブルの名前を変更する必要があります。MySQLは1つまたは複数のテーブルの名前を変更するには非常に便利な声明を提供します。
1つまたは複数のテーブルを変更するために、我々は、使用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のRENAME TABLEの例
まず、我々は、名前のファイルを作成hrdb
2つのテーブルで構成され、新しいデータベースを、:employees
とdepartments
。
データベースを作成します -
CREATE DATABASE IF NOT EXISTS hrdb;
テーブルを作成します -
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) );
次に、サンプルにデータemployees
とdepartments
テーブル:
-- 插入数据到 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);
第三に、クエリemployees
やdepartments
テーブルのデータ:
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
参照されるテーブルビューの名前を変更します
名前の変更がある場合の表示テーブル参照、リネーム表の後に、ビューは無効になり、手動で視野を調整する必要があります。
例えば、我々はベースemployees
とdepartments
テーブルは、名前の作成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);
使用の表示コネクタ接続句employees
とdepartments
テーブル。
次の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
さて、v_employee_info
ビューは、employees
テーブルの名前を変更people
し、データビューを問い合せます。
RENAME TABLE employees TO people;
-- 查询数据 SELECT * FROM v_employee_info;
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
我々は使用することができます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
手動で変更する必要がありv_employee_info
、それが参照するようにビューをpeople
代わりにテーブルをemployees
テーブル。
ストアドプロシージャによって参照される名前の変更テーブル
名前を変更するストアドプロシージャ参照テーブルを、手動で同じ画像を表示するために調整されなければなりません。
まず、people
にテーブルの名前を変更するemployees
テーブル。
RENAME TABLE people TO employees;
その後、名前のファイルを作成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;
次に、get_employee
からストアドプロシージャemployees
テーブル取得id
の1
従業員データを、次のように
CALL get_employee(1);
上記のクエリの実装、次の結果 -
mysql> CALL get_employee(1); +------------+-----------+-----------+ | first_name | last_name | dept_name | +------------+-----------+-----------+ | John | Doe | Sales | +------------+-----------+-----------+ 1 row in set Query OK, 0 rows affected
その後、我々は再びemployees
テーブルリネームpeople
テーブル。
RENAME TABLE employees TO people;
最後に、呼び出しget_employee
得るために、ストアドプロシージャをid
として2
従業員情報:
CALL get_employee(2);
MySQLは、次のエラーメッセージを返します。
1146 - Table 'hrdb.employees' doesn't exist
この問題を解決するために、我々は、手動でストアド・プロシージャ必要がありますemployees
にテーブルを変更するためのpeople
テーブルを。
名前の変更テーブルの外部キー参照
departments
テーブルの使用department_id
にリンクされている列employees
のテーブルを。employees
テーブルdepartment_id
列参照departments
テーブルdepartment_id
としてカラムの外部キー。
あなたは、名前を変更した場合departments
を指して、テーブルをdepartments
すべての外部キーが自動的に更新されることはありませんテーブル。この場合、我々は、手動で削除して、外部キーを再作成する必要があります。
RENAME TABLE departments TO depts;
我々は削除ID
のために1
、外部キー制約ので、部門people
テーブル内のすべての行も削除する必要があります。しかし、私たちがしますdepartment
し、テーブルの名前を変更しdepts
、次のように手動で外部キーを更新せずに、テーブル、MySQLは、エラーを返します:
DELETE FROM depts
WHERE
department_id = 1;
上記の文の実装は、以下の次のエラーメッセージ -
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`))
複数のテーブルの名前を変更します
また、使用することができRENAME TABLE
、一度に複数のテーブルの名前を変更する声明を。次の文を参照してください。
RENAME TABLE old_table_name_1 TO new_table_name_2,
old_table_name_2 TO new_table_name_2,...
次の文people
とdepts
名前の変更employees
やdepartments
テーブル:
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;
RENAME TABLE
声明では、あなたが使用することができ、一時テーブルの名前を変更するために使用することはできませんALTER 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: '.\hrdb\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;
+-----------+ | last_name | +-----------+ | Doe | | Lily | | Dave | | Jane | | Josh | | More | +-----------+ 6 rows in set
このチュートリアルでは、MySQLの使用方法をお見せRENAME TABLE
してALTER TABLE
、テーブルの名前を変更する声明を。