2009-10-18 13 views

risposta

12

Prova questo?

create_table(:table_name, :id => false) do |t| 
    t.integer :id, :options => 'PRIMARY KEY' 
end 
+3

Questo non ha funzionato con l'adattatore mysql2 e Rails 3.2.13 –

6

che non ha funzionato per me, ma il seguente fatto:

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

L'unico problema è che si perde nel schema.rb.

8

Ok, la domanda è vecchia e l'OP non ha specificato le versioni. Nessuna delle risposte qui riportati funzionato per me con queste versioni:

mysql2 0.3.11 
rails 3.2.13 
mysql 5.5 

ho finito per andare per questo:

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 

Spero che salva qualcuno là fuori dallo spendere tempo di monitoraggio questo in giù, o peggio ... usando la risposta senza verificare cosa fa al db ... perché il risultato dell'usare le risposte del soggiornante o del jim (con le mie versioni delle dipendenze) è che la migrazione funziona bene ma gli ID NULL sono consentiti e gli ID duplicati sono ammessi. Non ho provato la risposta di Shep perché non mi piace l'idea che db/schema.rb sia incoerente (+1 a Shep per essere esplicito riguardo a questa mancanza, a volte sarebbe una brutta cosa)

I'm non che il significato di questo, ma con questa soluzione, mysql describe lo mostra come una chiave primaria, stessa di un tavolo con AR predefinito: id ... come in:

tabella con predefinito AR: id

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

tabella con la mia soluzione:

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

che è un po 'interessante perché l'SQL generato dalla migrazione con la mia soluzione non include "PRIMARY KEY" (ovviamente) ... ma con AR predefinito: id lo fa ... quindi sembra mysql, almeno per describe tratta di una chiave non nullo unico-indicizzato come chiave primaria

HTH qualcuno

+0

Se si utilizza il proprio approccio di ': id => false', rimuovere' add_index: id' e invece usare 'execute 'ALTER TABLE foobars ADD PRIMARY KEY (id);'' dopo 'create_table', you ' Riceverò una colonna e un indice della chiave primaria vera. Questo dovrebbe essere DDL ANSI SQL-92 compatibile. – ches

+1

Anche se non lo farà in 'schema.rb', ugh. – ches

+0

@che è esattamente il motivo per cui ho abbandonato quell'idea :) –

4

È possibile creare una tabella come questa:

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 

e che in realtà funziona in Rails 4.0.2 e Postgresql 9.3.2.

+0

Questo sembrava fare quello che volevo per rails 4.2 e mysql ... ho cambiato leggermente in 'tger: id, null: false' – Intentss

Problemi correlati