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表 - 截断或不截断?的主要内容,如果未能解决你的问题,请参考以下文章