MySQL 5.6では,ALTER TABLE
を使用して,テーブルパーティションまたはサブパーティションをテーブルと交換できます。ここで,pt
交换分区p
与表nt
pt
はパーティション化されたテーブル,p
はパーティション化されていないテーブルnt
と交換するpt
のパーティションまたはサブパーティションです(次の記述が真正である場合)。
テーブル
nt
自体はパーティション化されていない。テーブル
nt
は一時テーブルではない。テーブル
pt
およびnt
の構造はそれ以外の点で同じである。テーブル
nt
は外部キー参照を含まず,ほかのどのテーブルもnt
を参照する外部キーを持たない。nt
内にp
のパーティション定義の境界の外に存在する行がない。
ALTER TABLE
ステートメントに通常必要な改变,更改
、插入
,および创建
権限に加えて,ALTER TABLE……交换分区
を実行するための下降
権限が必要です。
ALTER TABLE……交换分区
の次の影響も考慮してください。
ALTER TABLE……交换分区
を実行しても,パーティション化されたテーブルまたは交換されるテーブルに対するトリガーは呼び出されません。交換されるテーブル内の
AUTO_INCREMENT
カラムがリセットされます。忽略
キーワードは,ALTER TABLE……交换分区
と一緒に使用された場合,効果を持つません。
ALTER TABLE……交换分区
ステートメントの完全な構文を次に示します。ここで,pt
はパーティション化されたテーブル,p
は交換されるパーティションまたはサブパーティション,nt
はp
と交換されるパーティション化されていないテーブルです。
ALTER TABLEpt交换分区p与表nt;
単一修改表交换分区
ステートメントでは,1つのパーティションまたはサブパーティションのみを1つのパーティション化されていないテーブルのみと交換できます。複数のパーティションまたはサブパーティションを交換するには,複数の修改表交换分区
ステートメントを使用してください。交换分区
は,ほかのALTER TABLE
オプションと組み合わせることはできません。パーティション化されたテーブルによって使用されるパーティショニングおよび (該当する場合) サブパーティショニングには、MySQL 5.6 でサポートされる任意のタイプを選択できます。
パーティションをパーティション化されていないテーブルと交換する
次のSQLステートメントを使用して,パーティション化されたテーブルe
が作成および移入されているとします。
CREATE TABLE e (id INT NOT NULL, fname VARCHAR(30), lname VARCHAR(30)) PARTITION BY RANGE (id)(分区p0值小于(50),分区p1值小于(100),分区p2值小于(150),分区p3值小于(MAXVALUE));插入e值(1669年,“吉姆”,“史密斯”),(337年,“玛丽”,“琼斯”),(16,“弗兰克”,“白”),(2005年,“琳达”,“黑”);
ここで,e2
という名前の,e
のパーティション化されていないコピーを作成します。これは,mysqlクライアントを使用して次のように行うことができます。
mysql>创建表e2mysql> ALTER TABLE e2 REMOVE PARTITIONING;查询OK, 0行受影响(0.90秒)记录:0重复:0警告:0
テーブルe
のどのパーティションに行が含まれるかは,次のようにINFORMATION_SCHEMA。分区
テーブルを照会することで確認できます。
mysql> SELECT PARTITION_NAME, TABLE_ROWS -> FROM INFORMATION_SCHEMA。分区——> WHERE TABLE_NAME = 'e';+----------------+------------+ | PARTITION_NAME | TABLE_ROWS | +----------------+------------+ | p1 p0 | 1 | | | 0 | | p2 | 0 | | p3 | 3 | +----------------+------------+ 4行集(0.00秒)
パーティション化されたInnoDB
テーブルの場合,INFORMATION_SCHEMA。分区
テーブルのTABLE_ROWS
カラムに示される行数は,SQL最適化で使用される見積もり値であり,常に正確とはかぎりません。
テーブルe
内のパーティションp0
をテーブルe2
と交換するには,次のようなALTER TABLE
ステートメントを使用できます。
mysql> ALTER TABLE e EXCHANGE PARTITION p0 WITH TABLE e2;查询OK, 0行受影响(0.28秒)
より正確に言うと,ここで発行したステートメントによって,パーティションで見つかる行がテーブルで見つかるものと交換されます。これがどのように行われたかは,前のようにINFORMATION_SCHEMA。分区
テーブルを照会することで観察できます。パーティションp0
で以前は見つかったテーブル行が存在しなくなっています。
mysql> SELECT PARTITION_NAME, TABLE_ROWS -> FROM INFORMATION_SCHEMA。分区——> WHERE TABLE_NAME = 'e';+----------------+------------+ | PARTITION_NAME | TABLE_ROWS | +----------------+------------+ | p1 p0 | 0 | | | 0 | | p2 | 0 | | p3 | 3 | +----------------+------------+ 4行集(0.00秒)
テーブルe2
を照会すると,「見つからない」行がそこで見つかります。
mysql> SELECT * FROM e2;+----+-------+-------+ | id |帧| lname | +----+-------+-------+ | 弗兰克16 | |白色 | +----+-------+-------+ 1行集(0.00秒)
パーティションと交換されるテーブルは,必ずしも空である必要はありません。これを実証するために,まず新しい行をテーブルe
に挿入してから,この行がパーティションp0
に格納されていることを確認します(50より小さいid
カラム値を選択し,これをあとで分区
テーブルを照会することで確認します)。
mysql> INSERT INTO e VALUES (41, "Michael", "Green");mysql> SELECT PARTITION_NAME, TABLE_ROWS -> FROM INFORMATION_SCHEMA。分区——> WHERE TABLE_NAME = 'e';+----------------+------------+ | PARTITION_NAME | TABLE_ROWS | +----------------+------------+ | p1 p0 | 1 | | | 0 | | p2 | 0 | | p3 | 3 | +----------------+------------+ 4行集(0.00秒)
ここで,前と同じALTER TABLE
ステートメントを使用して,ふたたびパーティションp0
をテーブルe2
と交換します。
mysql> ALTER TABLE e EXCHANGE PARTITION p0 WITH TABLE e2;查询OK, 0行受影响(0.28秒)
次のクエリーの出力は,ALTER TABLE
ステートメントを発行する前に,パーティションp0
に格納されていたテーブル行およびテーブルe2
に格納されていたテーブル行の配置が切り替わったことを示しています。
mysql> SELECT * FROM e;+------+-------+-------+ | id |帧| lname | +------+-------+-------+ | 16 |弗兰克。怀特| | 1669 | |吉姆史密斯| | 337 | |玛丽琼斯| | 2005 | |琳达|黑色 | +------+-------+-------+ 4行集(0.00秒)mysql >选择PARTITION_NAME,从INFORMATION_SCHEMA TABLE_ROWS - >。分区——> WHERE TABLE_NAME = 'e';+----------------+------------+ | PARTITION_NAME | TABLE_ROWS | +----------------+------------+ | p1 p0 | 1 | | | 0 | | p2 | 0 | | p3 | 3 | +----------------+------------+ 4行集(0.00秒)从e2 mysql > SELECT *;+----+---------+-------+ | id |帧| lname | +----+---------+-------+ | 迈克尔41 | |绿色 | +----+---------+-------+ 1行集(0.00秒)
一致しない行
ALTER TABLE……交换分区
ステートメントを発行する前にパーティション化されていないテーブルで見つかる行は,それらがターゲットパーティションに格納されるために必要な条件を満たしている必要があり,そうでない場合はステートメントが失敗することを覚えておいてください。これがどのように発生するかを確認するために,まずテーブルe
のパーティションp0
のパーティション定義の境界外の行を,e2
に挿入します。たとえば,id
カラム値が大きすぎる行を挿入してから,テーブルをパーティションとふたたび交換してみてください。
mysql> INSERT INTO e2 VALUES (51, "Ellen", "McDonald");mysql> ALTER TABLE e EXCHANGE PARTITION p0 WITH TABLE e2;错误1707 (HY000):发现行不匹配分区
忽略
キーワードは受け入れられますが,次に示すように交换分区
で使用されるときは効果がありません。
mysql> ALTER IGNORE TABLE e EXCHANGE PARTITION p0 WITH TABLE e2;错误1707 (HY000):发现行不匹配分区
サブパーティションをパーティション化されていないテーブルと交換する
ALTER TABLE……交换分区
ステートメントを使用して,サブパーティション化されたテーブルのサブパーティション(セクション19.2.6”サブパーティショニング”を参照してください)をパーティション化されていないテーブルと交換することもできます。次の例では,まず范围
によってパーティション化され,关键
によってサブパーティション化されたテーブル西文
を作成し,テーブルe
と同様にこのテーブルに移入してから,このテーブルの空のパーティション化されていないコピーes2
を作成します。
mysql >创建表es (- > id INT NOT NULL, >帧VARCHAR (30) - - - > lname VARCHAR (30 ) -> ) -> 分区范围(id) - > SUBPARTITION通过键(lname) - > SUBPARTITIONS 2(- >分区p0值小于(50),- - - - - - >分区p1值小于(100)- >分区p2值小于(150)- >分区p3值小于(执行)- >);mysql> INSERT INTO es VALUES -> (1669, "Jim", "Smith"), -> (337, "Mary", "Jones"), -> (16, "Frank", "White"), -> (2005, "Linda", "Black");mysql> CREATE TABLE es2 LIKE es; mysql> CREATE TABLE es2 LIKE es;mysql> ALTER TABLE es2 REMOVE PARTITIONING;查询OK, 0行受影响(0.70秒)记录:0重复:0警告:0
テーブル西文
を作成するときにサブパーティションの名前を明示的に指定しなかったけれども,分区
テーブルから選択するときに,次のようにINFORMATION_SCHEMA
からそのテーブルのSUBPARTITION_NAME
を取り込むことで,それらに生成された名前を取得できます。
mysql> SELECT PARTITION_NAME, SUBPARTITION_NAME, TABLE_ROWS -> FROM INFORMATION_SCHEMA。2、查询表名:+----------------+-------------------+------------+ | PARTITION_NAME | SUBPARTITION_NAME | TABLE_ROWS | +----------------+-------------------+------------+ | p0 | p0sp0 | 1 | | p0 | p0sp1 | 0 | | p1 | p1sp0 | 0 | | p1 | p1sp1 | 0 | | p2 | p2sp0 | 0 | | p2 | p2sp1 | 0 | | p3 | p3sp0 | 3 | | p3 | p3sp1 | 0 |+----------------+-------------------+------------+ 8行集(0.00秒)
次のALTER TABLE
ステートメントは,テーブル西文
のサブパーティションp3sp0
をパーティション化されていないテーブルes2
と交換します。
ALTER TABLE表名ALTER TABLE表名查询OK, 0行受影响(0.29秒)
次のクエリーを発行することで,それらの行が交換されたことを確認できます。
mysql> SELECT PARTITION_NAME, SUBPARTITION_NAME, TABLE_ROWS -> FROM INFORMATION_SCHEMA。2、查询表名:+----------------+-------------------+------------+ | PARTITION_NAME | SUBPARTITION_NAME | TABLE_ROWS | +----------------+-------------------+------------+ | p0 | p0sp0 | 1 | | p0 | p0sp1 | 0 | | p1 | p1sp0 | 0 | | p1 | p1sp1 | 0 | | p2 | p2sp0 | 0 | | p2 | p2sp1 | 0 | | p3 | p3sp0 | 0 | | p3 | p3sp1 | 0 |+----------------+-------------------+------------+ 8行集(0.00秒)从es2 mysql > SELECT *;+------+-------+-------+ | id |帧| lname | +------+-------+-------+ | 玛丽1669年吉姆史密斯| | | | 337 | |琼斯| | 2005 |琳达|黑色 | +------+-------+-------+ 3行集(0.00秒)
テーブルがサブパーティション化されている場合,次に示すように,パーティション化されていないテーブルと交換できるのは,テーブルのパーティション全体ではなくサブパーティションのみです。
mysql> ALTER TABLE es EXCHANGE PARTITION p3 WITH TABLE es2;错误1704 (HY000): Subpartitioned table,使用subpartition而不是partition
MySQLによって使用されるテーブル構造の比較は非常に厳密です。カラムの数,順序,名前,および型,さらにパーティション化されたテーブルとパーティション化されていないテーブルのインデックスが,正確に一致する必要があります。また,両方のテーブルが同じストレージエンジンを使用している必要があります。
mysql>创建表es3mysql> ALTER TABLE es3 REMOVE PARTITIONING;查询OK, 0行影响(0.53秒)记录:0重复:0警告:0 mysql> SHOW CREATE TABLE es3\G *************************** 1。row *************************** Table: es3 Create Table: Create Table ' es3 ' (' id ' int(11) NOT NULL, ' fname ' varchar(30) DEFAULT NULL, ' lname ' varchar(30) DEFAULT NULL) ENGINE=InnoDB DEFAULT CHARSET=latin1 1 row in set (0.00 sec) mysql> ALTER Table es3 ENGINE= MyISAM;mysql> ALTER TABLE es EXCHANGE PARTITION p3sp0 WITH TABLE es3;ERROR 1497 (HY000):这个版本的MySQL不允许在分区中混合处理程序