创建 table 没有分区

create table without partitions

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

CREATE TABLE temp_utilization LIKE utilization WITHOUT PARTITIONING;

原文如下table:

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) */

我想创建一个临时文件 table,其中包含这样一个创建 table:

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

不,您似乎无法创建一个 table 与另一个 table 没有分区,如果它已经分区,按照您上面建议的一个命令。

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

来检查

如果您只是想在没有分区和数据的循环中一遍又一遍地创建 table,我看到了三个(添加了一个 b/c 的 Cez)选项。

  1. 将 table 定义硬编码到您的脚本中

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

  3. 运行 来自脚本的两个单独的命令:一个创建 table 之类的命令,然后一个更改 table 以循环删除分区的命令。

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

您可以在 dev.mysql 上创建 table 时参考您的选项。

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或者你想命名表