2009-10-18 8 views

Antwort

12

Versuchen Sie das?

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

Dies funktionierte nicht für mich mit mysql2 Adapter und Rails 3.2.13 –

6

, die nicht für mich arbeiten, aber die folgenden haben:

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

Das einzige Problem ist, dass man es in der schema.rb verlieren.

8

Okay, die Frage ist alt und das OP hat keine Versionen angegeben. Keine der gegebenen Antworten hier war für mich mit diesen Versionen:

mysql2 0.3.11 
rails 3.2.13 
mysql 5.5 

ich für diese gehen endete:

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 

Ich hoffe, dass jemand spart dort von Zeit zu verbringen diese aufzuspüren, oder noch schlimmer ... mit der Antwort ohne zu überprüfen, was es mit der db tut ... weil das Ergebnis der Verwendung von entweder Sojourners oder Jims Antworten (mit meinen Versionen der Abhängigkeiten) ist, dass die Migration gut läuft, aber NULL-IDs erlaubt sind, und doppelte IDs sind erlaubt. Ich habe die Antwort von Shep nicht versucht, weil ich die Idee von db/schema.rb nicht mag, die inkonsistent ist (+1 zu Shep, um über diesen Mangel ausdrücklich zu sein, manchmal würde das ein Schlechtes Ding sein)

Ich bin nicht sicher, ob diese von der Bedeutung, aber mit dieser Lösung, mysql describe zeigt es als Primärschlüssel, gleich wie eine AR-Tabelle mit Standard: id ... wie in:

Tabelle mit AR Standard: id

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

Tabelle mit meiner Lösung:

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

das ist irgendwie interessant, weil das SQL, das durch die Migration mit meiner Lösung erzeugt wird, "PRIMARY KEY" (natürlich) nicht einschließt ... aber mit AR Standard: id tut es ... so scheint es zumindest mysql für describe behandelt ein nicht-null-unique-indizierte Schlüssel als Primärschlüssel

HTH jemand

+0

Wenn Sie Ihren Ansatz von ': id => false 'verwenden, entfernen Sie die' add_index: id' und verwenden Sie stattdessen' execute 'ALTER TABLE foobars HINZUFÜGEN PRIMARY KEY (id);' 'nach der' create_table', Sie ' Ich bekomme eine echte Primärschlüsselspalte und einen Index. Dies sollte eine ANSI SQL-92-kompatible DDL sein. – ches

+1

Obwohl es nicht in 'schema.rb', ugh. – ches

+0

@ches, das ist genau, warum ich diese Idee aufgegeben :) –

4

Sie eine Tabelle wie folgt erstellen:

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 

und das funktioniert wirklich in Rails 4.0.2 und PostgreSQL 9.3.2.

+0

Dies schien zu tun was ich für rails 4.2 und mysql wollte ... Ich habe mich etwas geändert in 't.integer: id, null: false' – Intentss