Index: test/schema/frontbase.drop.sql =================================================================== --- test/schema/frontbase.drop.sql (revision 9248) +++ test/schema/frontbase.drop.sql (working copy) @@ -31,3 +31,4 @@ DROP TABLE numeric_data CASCADE; DROP TABLE mixed_case_monkeys CASCADE; DROP TABLE minimalistics CASCADE; +DROP TABLE nonnum_id_col_nopk CASCADE; Index: test/schema/sybase.drop.sql =================================================================== --- test/schema/sybase.drop.sql (revision 9248) +++ test/schema/sybase.drop.sql (working copy) @@ -32,4 +32,5 @@ DROP TABLE mixed_case_monkeys DROP TABLE minimalistics DROP TABLE schema_migrations +DROP TABLE nonnum_id_col_nopk; go Index: test/schema/firebird.drop.sql =================================================================== --- test/schema/firebird.drop.sql (revision 9248) +++ test/schema/firebird.drop.sql (working copy) @@ -32,6 +32,7 @@ DROP TABLE numeric_data; DROP TABLE mixed_case_monkeys; DROP TABLE minimalistics; +DROP TABLE nonnum_id_col_nopk; DROP DOMAIN D_BOOLEAN; Index: test/schema/sqlite.drop.sql =================================================================== --- test/schema/sqlite.drop.sql (revision 9248) +++ test/schema/sqlite.drop.sql (working copy) @@ -31,3 +31,4 @@ DROP TABLE numeric_data; DROP TABLE mixed_case_monkeys; DROP TABLE minimalistics; +DROP TABLE nonnum_id_col_nopk; Index: test/schema/schema.rb =================================================================== --- test/schema/schema.rb (revision 9248) +++ test/schema/schema.rb (working copy) @@ -424,4 +424,9 @@ t.integer :sponsorable_id t.string :sponsorable_type end + + create_table :nonnum_id_col_nopk, :id => false do |t| + t.text :id, :null => false + t.text :description, :null => false + end end Index: test/schema/oracle.drop.sql =================================================================== --- test/schema/oracle.drop.sql (revision 9248) +++ test/schema/oracle.drop.sql (working copy) @@ -32,6 +32,7 @@ drop table numeric_data; drop table mixed_case_monkeys; drop table minimalistics; +drop table nonnum_id_col_nopk; drop sequence accounts_seq; drop sequence funny_jokes_seq; Index: test/schema/db2.drop.sql =================================================================== --- test/schema/db2.drop.sql (revision 9248) +++ test/schema/db2.drop.sql (working copy) @@ -31,3 +31,4 @@ DROP TABLE numeric_data; DROP TABLE mixed_case_monkeys; DROP TABLE minimalistics; +DROP TABLE nonnum_id_col_nopk; Index: test/schema/postgresql.drop.sql =================================================================== --- test/schema/postgresql.drop.sql (revision 9248) +++ test/schema/postgresql.drop.sql (working copy) @@ -35,6 +35,7 @@ DROP TABLE numeric_data; DROP TABLE column_data; DROP TABLE mixed_case_monkeys; +DROP TABLE nonnum_id_col_nopk; DROP TABLE postgresql_arrays; DROP TABLE postgresql_moneys; DROP TABLE postgresql_numbers; Index: test/cases/schema_dumper_test.rb =================================================================== --- test/cases/schema_dumper_test.rb (revision 9248) +++ test/cases/schema_dumper_test.rb (working copy) @@ -102,7 +102,15 @@ ActiveRecord::SchemaDumper.dump(ActiveRecord::Base.connection, stream) end end - + + def test_schema_dump_preserves_nonnumeric_column_named_id_on_table_with_no_pk + output = standard_dump + match = output.match(%r{create_table "nonnum_id_col_nopk"(.*)do}) + assert_not_nil(match, "table with non-numeric id column and no primary key not found") + assert_match %r(:id => false), match[1], "explicit primary key disable not preserved" + assert_match %r{t.text\s+"id",\s+:null => false}, output, "non-numeric id column not preserved" + end + if current_adapter?(:MysqlAdapter) def test_schema_dump_should_not_add_default_value_for_mysql_text_field output = standard_dump Index: lib/active_record/schema_dumper.rb =================================================================== --- lib/active_record/schema_dumper.rb (revision 9248) +++ lib/active_record/schema_dumper.rb (working copy) @@ -78,8 +78,17 @@ if @connection.respond_to?(:pk_and_sequence_for) pk, pk_seq = @connection.pk_and_sequence_for(table) + else + pk = 'id' + # preserve non-numeric columns named 'id' on tables when we do not know if the table has a primary key + columns.map do |column| + next if column.name != pk + unless column.number? + pk = nil + break + end + end end - pk ||= 'id' tbl.print " create_table #{table.inspect}" if columns.detect { |c| c.name == pk }