【问题标题】:After copying with INSERT...SELECT, I have more records than before使用 INSERT...SELECT 复制后,我的记录比以前多
【发布时间】:2015-10-26 23:15:07
【问题描述】:

我遇到了一个奇怪的情况:我在 MySQL 5.6.14 中使用 INSERT INTO tabl1 (col1,...) SELECT (col2...) FROM tbl2... 和我的记录比以前多。准确的说是640。

我通过在两个表上执行 select count(*) 来检查,从旧表中减去新表(这给了我 -640)。

有什么想法吗?我想知道额外的 640 条记录是从哪里来的。

两者都是 InnoDB;旧表是拉丁字符集,新表是 utf8。怀疑这是等式的一部分,但也许对 MySQL 有更多经验的人会知道。

SQL 语句示例:

INSERT INTO `table1` (`col1`,`col2`,`col3`) SELECT (`colA`,`colB`,`colC`) FROM `table2`;

接收记录的表是新的,里面有0条记录,从来没有记录过。另外,它不是生产环境,所以除了这条语句之外,什么都不应该添加记录。

【问题讨论】:

  • 请出示您使用的完整声明。数据库是否在积极使用中?自从您运行 INSERT 后,有人会删除记录吗?
  • 如果您在插入之前已经有上一个表中的数据,那么您将拥有更多数据。如果您希望它们准确,那么您必须在插入之前先对表格进行截断。除非您的 sql 语句给您重复数据,否则您需要检查您的 sql statemetn。首先突出显示您的选择语句并运行它以查看结果,如果它正确,那么您需要做的就是在插入之前截断表格
  • 我将此添加到问题中,但接收记录的表是全新的,包括架构。它也不是生产环境,所以除了这个 1 语句之外没有其他事务。最后,旧表的计数小于新表的计数(插入后)。
  • 我不明白为什么这会给你比另一个表更多的行。您在该表上是否有一个触发器/过程正在生成虚拟行或其他东西?
  • 没有触发器/程序。

标签: mysql


【解决方案1】:

试试这个:

  1. 如果该表已存在于数据库中,则首先删除该表。这样您就可以确定tabl1 不会有任何额外数据。

    如果存在则删除表tabl1;

  2. 使用create table 语句重新创建要复制的表tabl2,将tabl2 中的所有内容复制到tabl1,如下所示:

    创建表tabl1 SELECT * FROM `tabl2

【讨论】:

  • 请解释你的答案。
  • 它已经在上面的 cmets 部分中解释过了,但是确定。
  • 评论是临时的野兽,答案需要完整,否则可以投票删除。现在它看起来更好了,我投了赞成票。
  • 哦,好的,我明白了。谢谢
猜你喜欢
  • 1970-01-01
  • 2020-09-12
  • 1970-01-01
  • 2019-09-01
  • 2010-09-16
  • 2020-06-03
  • 1970-01-01
  • 1970-01-01
  • 2012-04-06
相关资源
最近更新 更多