Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/85.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/elixir/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Mysql 使用现有数据向表中插入数据,然后删除会话期间未触及的数据_Mysql_Sql_Database_Sql Insert_Database Replication - Fatal编程技术网

Mysql 使用现有数据向表中插入数据,然后删除会话期间未触及的数据

Mysql 使用现有数据向表中插入数据,然后删除会话期间未触及的数据,mysql,sql,database,sql-insert,database-replication,Mysql,Sql,Database,Sql Insert,Database Replication,我在对一个充满数据的表进行重复键更新时插入了一堆 我需要用这些数据填充表,并删除我没有填充的数据(我的意思是删除我的插入中没有提到的行) 我试过的和起作用的: 在表中创建新的时间戳列 在插入过程中,使用当前时间戳插入或更新此列,以便我接触的所有行都有最新的时间戳 运行删除查询,删除早于脚本开始时间的所有行 这个想法非常有效,但有一个问题:我的复制二进制日志在两种模式(行和语句)上都被不必要的数据填充。我根本不需要复制时间戳 我不想在插入之前执行截断表,因为我的应用程序应该能够不间断地访问数据(旧

我在对一个充满数据的表进行重复键更新时插入了一堆

我需要用这些数据填充表,并删除我没有填充的数据(我的意思是删除我的
插入中没有提到的行)

我试过的和起作用的:

  • 在表中创建新的时间戳列
  • 在插入过程中,使用
    当前时间戳插入或更新此列,以便我接触的所有行都有最新的时间戳
  • 运行删除查询,删除早于脚本开始时间的所有行
  • 这个想法非常有效,但有一个问题:我的复制二进制日志在两种模式(行和语句)上都被不必要的数据填充。我根本不需要复制时间戳

    我不想在插入之前执行
    截断表
    ,因为我的应用程序应该能够不间断地访问数据(旧的或新的)。如果执行
    TRUNCATE TABLE
    操作,表可能会在一段时间内没有数据

    我还可以保存插入脚本内存或临时表中的所有主键值,然后删除不在该表中的行,但我希望有一种更优化、更聪明的方法来做到这一点


    你知道我怎样才能达到这个目标吗?这样我就可以更新数据,只删除未触及的行,只复制更改(我想是在行模式下)?

    我对复制二进制日志不太熟悉,如果不起作用,请提前道歉。我假设可以为表设置不同的日志记录

    我会这样做:

    • 为具有相同主键列的新数据创建一个表 旧桌子
    • 删除旧表中未在新表中找到的所有行
    • 根据新表更新旧表中的行
    这样就不会有不必要的日志插入。
    这假设您在服务器中有所需的空间,但可以工作。

    编辑您的问题并提供有关用例的更多详细信息。您要替换多少数据?应用程序能否使用更新前后的“部分”数据?有多少列正在被修改?
    truncate table
    方法在大多数情况下似乎都是正确的方法,因此很高兴知道为什么它在您的案例中不起作用。@GordonLinoff我的问题中写到了这个案例:因为我应该不间断地删除对数据的访问,不管它是旧的还是新的,这就是为什么。如果truncate表被复制,那么连接断开从属表将为空。这一点都不好。我不希望桌子在任何时候都是空的。您还需要考虑其他因素(例如复制),这些因素只是间接提及,没有提供任何大小调整。我的最佳猜测是,使用分区的解决方案可能最适合您的问题。在添加和删除分区时,您仍然会遇到一个“小问题”,但这应该是一个小的开销,并且和数据的大小无关。