ankane/pgsync · error · Error

Primary key required for --preserve

Error message

Primary key required for --preserve

What it means

Error "Primary key required for --preserve" thrown in ankane/pgsync.

Source

Thrown at lib/pgsync/task.rb:130

          log "    #{i}/#{batch_count}: #{where}"

          # TODO be smarter for advance sql clauses
          batch_sql_clause = " #{sql_clause.length > 0 ? "#{sql_clause} AND" : "WHERE"} #{where}"

          batch_copy_to_command = "COPY (SELECT #{copy_fields} FROM #{quoted_table}#{batch_sql_clause}) TO STDOUT"
          copy(batch_copy_to_command, dest_table: table, dest_fields: fields)

          starting_id += batch_size
          i += 1

          if opts[:sleep] && starting_id <= from_max_id
            sleep(opts[:sleep])
          end
        end
      elsif !opts[:truncate] && (opts[:overwrite] || opts[:preserve] || !sql_clause.empty?)
        if primary_key.empty?
          raise Error, "Primary key required for --overwrite" if opts[:overwrite]
          raise Error, "Primary key required for --preserve" if opts[:preserve]
          raise Error, "Primary key required to sync specific rows"
        end

        # create a temp table
        temp_table = "pgsync_#{rand(1_000_000_000)}"
        destination.execute("CREATE TEMPORARY TABLE #{quote_ident_full(temp_table)} AS TABLE #{quoted_table} WITH NO DATA")

        # load data
        copy(copy_to_command, dest_table: temp_table, dest_fields: fields)

        on_conflict = primary_key.map { |pk| quote_ident(pk) }.join(", ")
        action =
          if opts[:preserve]
            "NOTHING"
          else # overwrite or sql clause
            setter = shared_fields.reject { |f| primary_key.include?(f) }.map { |f| "#{quote_ident(f)} = EXCLUDED.#{quote_ident(f)}" }
            if setter.any?
              "UPDATE SET #{setter.join(", ")}"

View on GitHub (pinned to 57bdddf5db)

When it happens

Trigger: Thrown at lib/pgsync/task.rb:130 when the library encounters an invalid state.

Common situations: See trigger scenarios.


AI-assisted analysis of ankane/pgsync@57bdddf5db (2026-08-23). Data as JSON: /api/errors/f413a793dd3b7eef. Report an issue: GitHub.