# Non-standard primary key column

**URL:** <https://www.ruby-forum.com/t/non-standard-primary-key-column/82229>\
**Category:** Rails\
**Created:** [January 18, 2007, 12:21pm UTC](https://www.ruby-forum.com/t/non-standard-primary-key-column/82229 "2007-01-18T12:21:29Z")\
**Posts on this page:** 3\
**Page:** 1

<div class="post-metadata">

**Author:** ![threeeyedfish](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/t/a587f6/32.png) [@threeeyedfish](https://www.ruby-forum.com/u/threeeyedfish)\
**Post date:** [January 18, 2007, 12:21pm UTC](https://www.ruby-forum.com/t/non-standard-primary-key-column/82229/1 "2007-01-18T12:21:29Z")

</div>

Good day!  
I’ve recently started to develop under rails.  
I have a migration that should create a table, and I want the primary  
key id to be not standard auto-incrementing integer but explicitly  
given string.  
I have language codes and language native names in the table so I don’t  
want either to keep that meaningless integer id in the db or to have it  
appear in the uri.  
The first question is, does this seriously compromise rails’ magic?  
Will scaffolding work?  
The second question is, the migration doesn’t work as I suppose it  
should.  
It is

class CreateLanguages \< ActiveRecord::Migration  
def self.up  
create\_table :languages, {:id=\>false} do |t|  
t.column :id, :string, {:limit=\>12}  
t.column :name, :string, {:limit=\>60, :null=\>false}  
t.primary\_key :id  
end  
end

But what is created is like the last line is ignored

`id` varchar(12) default NULL,  
`name` varchar(60) NOT NULL

I’m using MySQL 5.0

Could you please clarify this behaviour and make a suggestion?

Your sincerely,  
Damian/Three-eyed Fish

---

<div class="post-metadata">

**Author:** ![threeeyedfish](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/t/a587f6/32.png) [@threeeyedfish](https://www.ruby-forum.com/u/threeeyedfish)\
**Post date:** [January 18, 2007, 12:59pm UTC](https://www.ruby-forum.com/t/non-standard-primary-key-column/82229/2 "2007-01-18T12:59:43Z")

</div>

Yes, this seriously compromises rails’ magic. It expects an auto  
incremented integer.

I’m not sure about the t.primary\_key method, but this should work:

def self.up  
execute “ALTER TABLE languages ADD id string(12) DEFAULT NULL PRIMARY  
KEY”  
end

A bit not-so-clean, though.

---

<div class="post-metadata">

**Author:** ![threeeyedfish](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/t/a587f6/32.png) [@threeeyedfish](https://www.ruby-forum.com/u/threeeyedfish)\
**Post date:** [January 18, 2007, 3:43pm UTC](https://www.ruby-forum.com/t/non-standard-primary-key-column/82229/3 "2007-01-18T15:43:10Z")

</div>

On Jan 18, 2007, at 14:58, removed\_email\_address@domain.invalid wrote:

> Yes, this seriously compromises rails’ magic. It expects an auto  
> incremented integer.

Thank you!  
I hope I will change my thinking and implement my system in a more  
railish way.

Your sincerely,  
Damian/Three-eyed Fish
