MySQL表 - 截断或不截断?

Posted

技术标签:

【中文标题】MySQL表 - 截断或不截断?【英文标题】:MySQL table - to truncate or not to truncate? 【发布时间】:2012-06-02 17:38:12 【问题描述】:

我的实时(托管)数据库和开发(本地)数据库中都有一个表。我想将一堆记录放入实时表中。

我一直在做的事情如下:

    使用 phpMyAdmin 将活动表的副本导出/导入回开发数据库。 使用 C 批处理文件将新数据加载到开发表中。 再次使用 phpMyAdmin 将更新后的开发表的副本导出/导入到实时数据库。

就目前而言,这一切都很好。

问题是这样的:如果一条记录已在 live 表中删除,第 1 步不会将它从 dev 表中删除(即使您选择了“用文件替换表”选项)。然后在第 3 步在活动表中重新创建此记录。

我的问题:我是否应该在第 1 步导入之前截断开发表(当然是在备份之后)?我的导入会将开发表上的自动增量设置为与实时表上的相同点吗?还是我要把事情搞得一团糟?

谢谢。

编辑:这是表格。 (无法更好地格式化;抱歉。)

列 - 类型 - NULL - 默认

cnum smallint(6) 否 unum smallint(6) 否 1 cat_subject smallint(2) 否 0 cat_major smallint(2) 没有 0 cat_minor smallint(2) 否 0 cat_flavour char(1) 是 NULL unmod varchar(255) 否

索引:

键名类型唯一压缩列基数排序空注释

PRIMARY BTREE 是 否 cnum 2214 A 否

【问题讨论】:

【参考方案1】:

mysql 中截断表将重置自动编号/身份列。除非您的脚本明确地将自动编号从 live 插入到 dev 中,否则您将遇到一个大问题。

如果您可以发布一些表结构和代码,我将能够通过一些代码为您提供更好的答案。

更新:

只是为了澄清一点关于自动编号和 MySQL 的信息。让我们创建一个表如下:

CREATE TABLE `testcust` (
 `TestCustID` int(11) NOT NULL AUTO_INCREMENT,
  `Name` varchar(32) DEFAULT NULL,
 PRIMARY KEY (`TestCustID`)
) ENGINE=InnoDB;

如果我使用以下查询插入数据:

INSERT INTO `test`.`TestCust`
(`TestCustID`,
  `Name`
)
VALUES
(
  NULL,
 'Pieter'
);

然后在这张桌子上运行一个 select * 我会看到类似这样的东西。

TestCustID     Name
 '1',          'Pieter'

由于我没有指定 TestCustID MySQl 将生成一个。如果我运行以下插入查询:

INSERT INTO `test`.`TestCust`
 (`TestCustID`,
  `Name`
 )
 VALUES
 (
     15,
     'Pieter'
 );

然后在我会看到的桌子上运行一个 select *

TestCustID     Name
 '1'          'Pieter'
 '15'         'Pieter'

因此,如果您截断您的表,它会将 TestCustID 重置为 1(从头开始)。如果您在插入语句中明确指定生产/实时系统中的自动编号,如果您未在其中指定自动编号,您将保持同步插入语句将不同步。

希望能更清楚一点。

【讨论】:

感谢您的回复。我用表格格式编辑了帖子。我可以再次手动设置自动增量吗?如有必要,我可以放上 C 代码,尽管我不确定这就是我的问题所在。只要自增正确,批量上传就可以了。 只是出于兴趣,在您执行第二次“Pieter”插入后,自动增量将设置为多少?会是 16 岁吗? 是的,应该是 16。显式设置自动编号的值会修改生成的下一个值。【参考方案2】:

截断后您不需要导出/导入主自动增量列。只需导入其余的列。它会自动管理自增列。

【讨论】:

这就是问题所在。他需要自动编号保持同步。因此,如果他在生产系统中有间隙,然后将没有这些间隙的它们插入到 dev 中,它们就会不同步。 只需删除表并使用/包括 create table 语句将其导入。当您从生产中导出它时,只需将其结构与创建表语句一起导出,稍后只需在从开发中删除其副本后将其导入到开发中。它将同步您的数据。

以上是关于MySQL表 - 截断或不截断?的主要内容,如果未能解决你的问题,请参考以下文章

达到表大小限制时,MYSQL 是不是会截断表?

在一个命令中截断 MySQL 数据库中的所有表?

sql 截断所有MySQL表

在 MySQL 中,删除似乎正在截断整个表

截断所有 MySql 表的 shell 脚本

存储过程是不是可以调用截断 veiw 表并将数据输入到 MySql 中的视图表中[关闭]