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

Resumen express de coffeescript

Gonzalo Sánchez
10 años ago

WordPress es amigable y no pasa de moda

Carolina Arrunátegui
6 años ago

Novedades de Unreal Engine 5

Fernando
4 años ago
Salir de la versión móvil