MySQL表 - 截断还是不截断?

时间:2012-05-28 10:35:32

标签: mysql import phpmyadmin truncate

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

我一直在做的事情如下:

  1. 使用phpMyAdmin将实时表的副本导出/导入到开发者数据库。
  2. 使用C批处理文件将新数据加载到开发表中。
  3. 使用phpMyAdmin再次将更新的开发表的副本导出/导入到实时数据库。
  4. 就这一切而言,一切正常。

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

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

    感谢。

    编辑:这是表格。 (不能让它更好地格式化;对不起。)

      

    列 - 类型 - 空 - 默认

         

    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)否

    指数:

      

    Keyname Type独特的打包列基数整理无评论

         

    PRIMARY BTREE是否cnum 2214 A否

2 个答案:

答案 0 :(得分:4)

在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'
);

在这张桌子上运行了一个选择*我会看到这样的东西。

TestCustID     Name
 '1',          'Pieter'

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

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

然后在我看到的桌子上跑了一个选择*

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

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

希望能再澄清一点。

答案 1 :(得分:1)

截断后您无需导出/导入该主要自动增量列。只需导入其余列。它将自动管理自动增量列。