MySQL 表 - 截断还是不截断?

Nic*_*ick 2 mysql import truncate phpmyadmin

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

我一直在做的事情如下:

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

就目前而言,这一切都运行良好。

问题是这样的:如果活动表中的记录已被删除,步骤 1 不会将其从开发表中删除(即使您选择“用文件替换表”选项)。然后在第 3 步在实时表中重新创建该记录。

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

谢谢。

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

列 - 类型 - NULL - 默认

cnumsmallint(6) 否
unumsmallint(6) 否 1
cat_subjectsmallint(2) 否
0cat_majorsmallint(2) 否
0cat_minorsmallint(2) 否
0cat_flavour char(1) 是 NULL
unmod varchar(255)否

指数:

键名类型唯一填充列基数排序规则空注释

PRIMARY BTREE 是 否 cnum 2214 A 否

Nam*_*ian 5

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

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

更新:

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

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

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

INSERT INTO `test`.`TestCust`
(`TestCustID`,
  `Name`
)
VALUES
(
  NULL,
 'Pieter'
);
Run Code Online (Sandbox Code Playgroud)

并在此表上运行 select * 我会看到类似的内容。

TestCustID     Name
 '1',          'Pieter'
Run Code Online (Sandbox Code Playgroud)

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

INSERT INTO `test`.`TestCust`
 (`TestCustID`,
  `Name`
 )
 VALUES
 (
     15,
     'Pieter'
 );
Run Code Online (Sandbox Code Playgroud)

然后在我会看到的表上运行 select *

TestCustID     Name
 '1'          'Pieter'
 '15'         'Pieter'
Run Code Online (Sandbox Code Playgroud)

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

希望能澄清一点。