10bet网址
MySQL 5.6リファレンスマニュアル
本手册下载
PDF (Ltr)- 26.8 mb
PDF (A4)- 26.8 mb


MySQL 5.6リファレンスマニュアル/.../ パーティションとサブパーティションをテーブルと交換する

19.3.3パーティションとサブパーティションをテーブルと交換する

MySQL 5.6では,ALTER TABLEpt交换分区p与表ntを使用して,テーブルパーティションまたはサブパーティションをテーブルと交換できます。ここで,ptはパーティション化されたテーブル,pはパーティション化されていないテーブルntと交換するptのパーティションまたはサブパーティションです(次の記述が真正である場合)。

  1. テーブルnt自体はパーティション化されていない。

  2. テーブルntは一時テーブルではない。

  3. テーブルptおよびntの構造はそれ以外の点で同じである。

  4. テーブルntは外部キー参照を含まず,ほかのどのテーブルもntを参照する外部キーを持たない。

  5. nt内にpのパーティション定義の境界の外に存在する行がない。

ALTER TABLEステートメントに通常必要な改变,更改插入,および创建権限に加えて,ALTER TABLE……交换分区を実行するための下降権限が必要です。

ALTER TABLE……交换分区の次の影響も考慮してください。

  • ALTER TABLE……交换分区を実行しても,パーティション化されたテーブルまたは交換されるテーブルに対するトリガーは呼び出されません。

  • 交換されるテーブル内のAUTO_INCREMENTカラムがリセットされます。

  • 忽略キーワードは,ALTER TABLE……交换分区と一緒に使用された場合,効果を持つません。

ALTER TABLE……交换分区ステートメントの完全な構文を次に示します。ここで,ptはパーティション化されたテーブル,pは交換されるパーティションまたはサブパーティション,ntpと交換されるパーティション化されていないテーブルです。

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不允许在分区中混合处理程序

本手册下载
PDF (Ltr)- 26.8 mb
PDF (A4)- 26.8 mb