Desafío Latam
Uncategorized

Reseteando claves primarias en rails

Cuando se cargan datos desde el seeds en rails y se ingresan claves primarias manualmente quedaremos en un problema donde no podremos ingresar nuevos elementos, obtendremos un error del tipo:

[symple_box color=»red» fade_in=»false» float=»center» text_align=»center» width=»»]
PG::UniqueViolation: ERROR: duplicate key value violates unique constraint «campaigns_pkey» DETAIL: Key (id)=(1) already exists. : INSERT INTO «campaigns» («company_id», «created_at», «updated_at») VALUES ($1, $2, $3) RETURNING «id»
[/symple_box]

Esto se debe a que cuando ingresamos valores manualmente el valor de la secuencia autoincremental no se incrementa, y luego caemos en la posibilidad de que al ingresar un dato el valor entregado por el secuenciador ya se encuentre en la base de datos causando un error de duplicidad de clave primaria.

Resolviendo el problema de las claves primarias

La forma de resolver esto consiste en resetear los valores de los secuenciadores a los ids del último registro de cada tabla, y de esta forma que sea imposible que se genere una clave primaria duplicada.

ActiveRecord::Base.connection.tables.each do |table|
  if table != "schema_migrations"
    result = ActiveRecord::Base.connection
      .execute("SELECT id FROM #{table} ORDER BY id DESC LIMIT 1")
    ai_val = result.first['id'].to_i + 1
    puts "Resetting auto increment ID for #{table} to #{ai_val}"
    ActiveRecord::Base.connection
      .execute("ALTER SEQUENCE #{table}_id_seq RESTART WITH #{ai_val}")
  end
end

 

Artículos relacionados

5 Razones de No contratar juniors TI y lo erróneo de esto

Alejandro Berezin
1 año ago

21 grandes predicciones para este 2016

Diego Arias
8 años ago

Mi experiencia con el primer bootcamp de Android

Erick Navarro
7 años ago
Salir de la versión móvil