Es posible la creación de la clave primaria sin auto_increment bandera en ActiveRecord?

Yo no puedo hacer

create table :blah, :id => false

porque quiero tener un índice de clave principal en la columna. Miré hacia arriba documentación, pero no encontró nada útil.

Es posible la creación de la clave primaria sin auto_increment?

OriginalEl autor Jakub Arnold | 2009-10-18

7 Comentarios

  1. 12

    Probar esto?

    create_table(:table_name, :id => false) do |t|
      t.integer :id, :options => 'PRIMARY KEY'
    end
    Este no me funciona con mysql2 adaptador y Rieles 3.2.13

    OriginalEl autor Jim

  2. 7

    Bien, la pregunta es vieja y el OP no especificar versiones. Ninguna de las respuestas que se dan aquí trabajó para mí con estas versiones:

    mysql2 0.3.11
    rails 3.2.13 
    mysql 5.5

    Terminé yendo para esto:

    class SomeMigration < ActiveRecord::Migration
      # emulate a primary_key column without auto-increment
      # the solution here is to use a non-null integer id column with a unique index
      # this is semantically different from PRIMARY KEY in mysql but not
      # _too_ functionally different, the only difference is that mysql enforces
      # no-more-than-one-primary-key but allows >1 unique index
      def up
        create_table :foobars, :id => false do |t|
          t.integer :id, :null => false
          t.string :name
        end
        add_index :foobars, :id, :unique => true
      end
    end

    Espero que salva a alguien de pasar el tiempo de seguimiento de este hacia abajo, o peor … el uso de la respuesta sin comprobar lo que hace a la db … porque el resultado del uso de cualquiera de peregrino o de jim respuestas (con mis versiones de las dependencias) es que la migración se ejecuta bien, pero NULL id están permitidos, y los identificadores duplicados están permitidos. Yo no trato Shep la respuesta de porque no me gusta la idea de db/esquema.rb está siendo incoherente (+1 a Shep para ser explícito acerca de que los defectos, a veces, que sería una Cosa Mala)

    No estoy seguro de que el significado de esto, pero con esta solución, mysql describe se muestra como una clave principal, mismo como un AR de tabla predeterminado :id … como en:

    tabla con AR predeterminado :id

    +---------------------+--------------+------+-----+---------+----------------+
    | Field               | Type         | Null | Key | Default | Extra          |
    +---------------------+--------------+------+-----+---------+----------------+
    | id                  | int(11)      | NO   | PRI | NULL    | auto_increment |

    mesa con mi solución:

    +--------------+--------------+------+-----+---------+-------+
    | Field        | Type         | Null | Key | Default | Extra |
    +--------------+--------------+------+-----+---------+-------+
    | id           | int(11)      | NO   | PRI | NULL    |       |

    que es interesante porque el SQL generado por la migración con mi solución no incluye la «CLAVE PRINCIPAL» (por supuesto) … pero con AR predeterminado :id lo hace … por lo que parece mysql, al menos para describe trata de un no-null único indexado clave como clave principal

    HTH alguien

    Si usted utiliza su enfoque de :id => false, quitar el add_index :id y en lugar de usar execute 'ALTER TABLE foobars ADD PRIMARY KEY (id);' después de la create_table, obtendrás una verdadera columna de clave principal y el índice. Esto debería ser la norma ANSI SQL-92 compatible DDL.
    Aunque no va a hacer en schema.rb, ugh.
    eso es exactamente por qué he abandonado esa idea 🙂
    Sólo el add_index método necesita un cambio, creo que debe ser add_index :foobars, :id, :unique => true , de lo contrario me estaba dando algún error.
    Buena solución @BlakeMiller — para que funcione (yo estoy usando Rails 5.1.3) también tuve que agregar esto a la parte superior de la clase de modelo: self.primary_key = 'id'

    OriginalEl autor Blake Miller

  3. 6

    Que no funciona para mí, pero el siguiente:

    create_table(:table_name, :id => false) do |t|
      t.column :id, 'int(11) PRIMARY KEY'
    end

    Único problema es que se pierde en el esquema.rb.

    OriginalEl autor Shep

  4. 4

    Puede crear una tabla como esta:

    class CreateUsers < ActiveRecord::Migration
      def change
        create_table :routers, { id: false } do |t|
          t.integer :id
        end
    
        execute "ALTER TABLE routers ADD PRIMARY KEY (id);"
      end
    end

    Y que realmente funciona en Rails 4.0.2 y Postgresql 9.3.2.

    Esto parecía hacer lo que yo quería para rails 4.2 y mysql… me hizo cambiar un poco a t.integer :id, null: false

    OriginalEl autor Eric Wu

  5. 0

    Para deshabilitar el auto de incremento como de los Carriles 5, usted puede simplemente pasar

    default: nil

    por ejemplo

    create_table :table_name, id: :bigint, default: nil do |t|
      # ... fields ...
    end
    no funciona con t.primary_key :some_id

    OriginalEl autor Curious Sam

  6. 0

    En Rails 5 usted puede hacer

    create_table :blah, id: :integer do |t|

    Si desea cambiar el nombre de la columna de clave principal de paso primary_key parámetro:

    create_table :blah, id: :integer, primary_key: :my_awesome_id do |t|

    Ver create_table documentación.

    OriginalEl autor Pavel Chuchuva

  7. 0
      def change
        create_table :tablename do |t|
          # t.string :fieldname
        end
    
       change_column :tablename, :id, :bigint, auto_increment: false
     end

    Aviso: Desde Rails 5.1 predeterminada de las claves principales son de tipo bigint. http://www.mccartie.com/2016/12/05/rails-5.1.html

    Si quieres 4 bytes de cambio de clave :bigint a :integer

    OriginalEl autor albertm

Dejar respuesta

Please enter your comment!
Please enter your name here