检测到重复时,将auto_increment id替换为下一个空闲ID

时间:2017-08-16 11:46:55

标签: mysql

我正在尝试从同一个数据库中的一个表到另一个表进行数据迁移。问题是我正在导入的表中的记录,可以有不同的数据,但包含主键的相同自动增量ID,所以当我尝试导入它时,它显然说它不能写它由于重复键。

我尝试过以下查询来解决这个问题:

INSERT INTO my_table SELECT * FROM my_temp_table ON DUPLICATE KEY UPDATE my_table.LogID=LAST_INSERT_ID(my_table.LogID);

这个查询似乎有效,MySQL说它已经写了10000行到表,除了它实际上没有。

如何插入my_temp_table中的所有行,但插入唯一的自动增量ID?

更新

根据要求在桌面上提供更多信息。两个表明显相同。该表包含LogID(这是自动增量主键)的时间戳和一些其他字段。存在一个问题,即数据库表包含7月1日到3月的一些时间戳,但不包含应该具有的所有时间戳。

有一个较旧的数据库服务器,它有正确的信息,所以我做了

CREATE TABLE my_temp_table LIKE my_table

然后将1月1日到7月3日导入我的临时表中,如此

INSERT INTO my_temp_table SELECT * FROM my_table WHERE Date BETWEEN '2017-07-01' AND '2017-07-03'

然后将mysqldump'复制到新服务器并导入。

在新服务器上,我删除了7月1日到7月3日的所有记录,如下所示:

DELETE FROM my_table WHERE Date BETWEEN '2017-07-01' AND '2017-07-03'

现在我需要将7月1日到3月的数据从我的temp_table获取到my_table,这样数据库就可以获得这两个日期之间所需的所有信息。

因为my_table在7月份的原因中插入了其他记录,并且旧服务器正在添加更多数据,因为它在7月的前3天正常工作,旧的服务器记录具有与新服务器冲突的auto_increment ID所以我需要将这些行从旧服务器导入到新服务器,但确保日志ID是新的,以便可以插入。

3 个答案:

答案 0 :(得分:0)

据推测,您并不关心新表中的行是否具有与旧表中的行相同的自动递增ID值。

在这种情况下,允许MySQL生成新的id值,如下所示。

INSERT INTO my_table
            (col2, col3, col4, col5) 
     SELECT col2, col3, col4, col5
       FROM my_temp_table 

在列名称列表中(我的示例中为col2, col3, col4, col5),请勿提及自动增量列。然后,MySQL将正确生成其值,但使用新的值序列。

如果您希望按特定顺序对这些行进行新的自动增量序列,则可以使用ORDER BY子句来实现。

使用LAST_INSERT_ID()您在示例中的方式无法正常工作。

答案 1 :(得分:0)

如果您需要主键与时间轴对应,则表示最旧的条目 - >最低密钥然后按照这些步骤。

我作为一个开发人员永远不会指望如果我选择按主要顺序排列的条目将是按时间顺序混乱。

  1. 在间隙

    之后删除所有键

    print (pd.to_numeric(df['rate'], errors='coerce')) 0 NaN 1 NaN 2 NaN 3 NaN 4 NaN 5 NaN 6 NaN 7 NaN 8 NaN 9 0.50 10 NaN 11 NaN 12 0.25 13 0.00 14 NaN 15 1.00 16 NaN Name: rate, dtype: float64 sumRate = pd.to_numeric(df['rate'], errors='coerce').sum() print (sumRate) 1.75

  2. 使用键(或键翻译)插入临时条目

    UPDATE my_table SET primary = primary + 1000 WHERE Date BETWEEN '2017-07-01' AND '2017-07-03'

  3. 按照here

  4. 所述包含自动增量值

答案 2 :(得分:-3)

我认为两个源表的自动增量主键不应与共享目标列的自动增量列有任何关系。如果您希望保留原始主键,请在非唯一列中保留原始主键。