创建没有分区的表

时间:2015-05-28 20:50:43

标签: python mysql innodb

我正在尝试通过python脚本创建表的副本,该脚本具有除分区之外的所有原始质量。我想在我的脚本中多次执行此操作(通过for循环)因为我想mysqldump来自该表的旧数据的日常文件,所以我试图使用类似的东西:

CREATE TABLE temp_utilization LIKE utilization WITHOUT PARTITIONING;

这是原始表格:

CREATE TABLE `utilization` (
  `wrep_time` timestamp NULL DEFAULT NULL,
  `end_time` timestamp NULL DEFAULT NULL,
  `location` varchar(64) NOT NULL,
  `sub_location` varchar(64) NOT NULL,
  `model_id` varchar(255) DEFAULT NULL,
  `offline` int(11) DEFAULT NULL,
  `disabled` int(11) NOT NULL DEFAULT '0',
  `total` int(11) NOT NULL DEFAULT '0',
  PRIMARY KEY (`location`,`sub_location`,`wrep_time`),
  KEY `key_location` (`location`),
  KEY `key_sub_location` (`sub_location`),
  KEY `end_time` (`end_time`),
  KEY `wrep_time` (`wrep_time`)
) ENGINE=InnoDB DEFAULT CHARSET=latin1
/*!50100 PARTITION BY RANGE (UNIX_TIMESTAMP(wrep_time))
(PARTITION p0 VALUES LESS THAN (1391990400) ENGINE = InnoDB,
 PARTITION p1 VALUES LESS THAN (1392076800) ENGINE = InnoDB,
 PARTITION p2 VALUES LESS THAN (1392163200) ENGINE = InnoDB,
 PARTITION p3 VALUES LESS THAN (1392249600) ENGINE = InnoDB,
 PARTITION p492 VALUES LESS THAN (1434499200) ENGINE = InnoDB,
 PARTITION p493 VALUES LESS THAN (1434585600) ENGINE = InnoDB,
 PARTITION p494 VALUES LESS THAN (1434672000) ENGINE = InnoDB,
 PARTITION p495 VALUES LESS THAN (1434758400) ENGINE = InnoDB,
 PARTITION p496 VALUES LESS THAN MAXVALUE ENGINE = InnoDB) */

我想创建一个包含这样的创建表的临时表:

CREATE TABLE `temp_utilization` (
  `wrep_time` timestamp NULL DEFAULT NULL,
  `end_time` timestamp NULL DEFAULT NULL,
  `location` varchar(64) NOT NULL,
  `sub_location` varchar(64) NOT NULL,
  `model_id` varchar(255) DEFAULT NULL,
  `offline` int(11) DEFAULT NULL,
  `disabled` int(11) NOT NULL DEFAULT '0',
  `total` int(11) NOT NULL DEFAULT '0',
  PRIMARY KEY (`location`,`sub_location`,`wrep_time`),
  KEY `key_location` (`location`),
  KEY `key_sub_location` (`sub_location`),
  KEY `end_time` (`end_time`),
  KEY `wrep_time` (`wrep_time`)
) ENGINE=InnoDB DEFAULT CHARSET=latin1

2 个答案:

答案 0 :(得分:2)

mysql> alter table utilization remove partitioning;
Query OK, 0 rows affected (0.40 sec)
Records: 0  Duplicates: 0  Warnings: 0

mysql> show create table utilization\G
*************************** 1. row ***************************
       Table: utilization
Create Table: CREATE TABLE `utilization` (
  `wrep_time` timestamp NOT NULL DEFAULT '0000-00-00 00:00:00',
  `end_time` timestamp NULL DEFAULT NULL,
  `location` varchar(64) NOT NULL,
  `sub_location` varchar(64) NOT NULL,
  `model_id` varchar(255) DEFAULT NULL,
  `offline` int(11) DEFAULT NULL,
  `disabled` int(11) NOT NULL DEFAULT '0',
  `total` int(11) NOT NULL DEFAULT '0',
  PRIMARY KEY (`location`,`sub_location`,`wrep_time`),
  KEY `key_location` (`location`),
  KEY `key_sub_location` (`sub_location`),
  KEY `end_time` (`end_time`),
  KEY `wrep_time` (`wrep_time`)
) ENGINE=InnoDB DEFAULT CHARSET=latin1

所以,举个例子:

CREATE TABLE temp_utilization LIKE utilization;
ALTER TABLE temp_utilization REMOVE PARTITIONING;

然后在你的循环中你可以CREATE TABLE t1 LIKE temp_utilization或者你想命名表

答案 1 :(得分:1)

不,如上所述,您可以在一个命令中创建一个没有分区的表,如果它已经被分区了那么表。

分区是表定义的一部分,存储在元数据中。您可以通过执行show create table yourtablename;

来检查

如果你只想在没有分区和数据的循环中反复创建表,我会看到三个(添加一个B / C的Cez)选项。

  1. 在您的脚本中对表定义进行硬编码

  2. 在没有分区的DB中创建表。因此,您已经创建了一个临时表,并将其用作模板循环。

  3. 从您的脚本运行两个单独的命令:一个create table,然后是一个alter table,用于删除循环中的分区。

  4. 您可以选择最适合您环境的选项。

    您可以在dev.mysql创建表格时引用您的选项。