2011-03-16 10 views
21

He creado una tabla sin una clave principal (: id => falso), pero ahora ha vuelto a morder mi trasero.¿Cómo agrego retroactivamente una clave primaria a mi mesa en los rieles?

Mi aplicación ya está en producción y no puedo simplemente dejarla caer y volver a crear otra.

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

+1

que motor DB está utilizando? – Augusto

+0

¡Asegúrese de probar cualquier cambio que realice en un sistema de prueba, no en producción! –

+0

sqlite en desarrollo, pero PostgreSQL en producción –

Respuesta

1

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

Puede agregar esta columna y establecerla como clave principal.

+0

¿hay alguna manera de hacerlo? –

+0

¿O la instrucción SQL funcionará tanto para sqlite como para PostgreSQL? –

0

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

+0

¿Cuál sería la mejor manera de transferir los datos a una nueva tabla? –

35

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

add_column :my_table, :id, :primary_key

Sin embargo, el texto de su pregunta sugiere que la 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 autoincremento en una tabla.

Si ya dispones de una columna de incremento automático y en realidad se desea utilizar esa columna como clave primaria, sólo tiene que añadir lo siguiente a su modelo:

set_primary_key "my_existing_column"

o en versiones más recientes de carriles:

self.primary_key = "my_existing_column"

En el caso de que ya dispone de una columna de incremento automático y no se puede usar eso como la clave principal, puede estar fuera de suerte.

+0

Gracias. Información muy útil. –

+1

Parece que set_primary_key ya no existe https://github.com/composite-primary-keys/composite_primary_keys/issues/83 – frankpinto

2

Si por alguna razón creó una tabla con un campo personalizado id, pero se olvidó de configurar id como clave principal, debe ejecutar una migración para crear la restricción de clave principal. El 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 
Cuestiones relacionadas