type remove rails generate foreign column change ruby-on-rails migration primary-key key

ruby-on-rails - generate - rails remove column



¿Cómo agrego retroactivamente una clave primaria a mi mesa en los rieles? (4)

¿Fue esta una tabla de unión que ahora necesita convertirse en un modelo real con una clave principal? Si es así, lo mejor es crear la nueva tabla y copiar los datos en ella.

He creado una tabla sin una clave principal (: id => false), pero ahora ha vuelto para morderme el culo.

Mi aplicación ya está en producción y no puedo soltarla y recrear otra.

¿Hay alguna forma de ejecutar una migración para agregar otra columna de clave primaria de incremento automático a mi tabla?


El comando para agregar una clave principal en una migración es:

add_column :my_table, :id, :primary_key

Sin embargo, la redacción de su pregunta sugiere que su tabla ya tiene una columna de incremento automático. A menos que me equivoque, hay varios DBMS que no permiten más de una columna de incremento automático en una tabla.

Si ya TIENE una columna de incremento automático y realmente desea usar esa columna como su clave principal, simplemente agregue lo siguiente a su modelo:

set_primary_key "my_existing_column"

O en versiones más recientes de Rails:

self.primary_key = "my_existing_column"

En el caso de que ya tenga una columna de incremento automático y no pueda usarla como clave principal, es posible que no tenga suerte.


Sé que en mySQl puede agregar una columna que tiene un valor de incremento predeterminado. Si agrega eso, entonces cada fila tendrá un valor int único (y cualquier fila nueva obtendrá un valor int 1 mayor que la última fila agregada)

Podría agregar esta columna y establecerla como clave principal.


Si por alguna razón creó una tabla con un campo de id personalizado, pero olvidó establecer la id como la clave principal, debe ejecutar una migración para crear la restricción de la clave principal. Lo siguiente fue probado contra una base de datos PostgreSQL:

class AddPrimaryKeyConstraintToFoobars < ActiveRecord::Migration def up execute "ALTER TABLE foobars ADD PRIMARY KEY (id);" end def down execute "ALTER TABLE foobars DROP CONSTRAINT foobars_pkey;" end end