Account Options

  1. Sign in
The old Google Groups will be going away soon, but your browser is incompatible with the new version.
Google Groups Home
« Groups Home
Message from discussion How to create a UNIQUE table constraint with migrations.
The group you are posting to is a Usenet group. Messages posted to this group will make your email address visible to anyone on the Internet.
Your reply message has not been sent.
Your post was successful
 
From:
To:
Cc:
Followup To:
Add Cc | Add Followup-to | Edit Subject
Subject:
Validation:
For verification purposes please type the characters you see in the picture below or the numbers you hear by clicking the accessibility icon. Listen and type the numbers you hear
 
Philip Hallstrom  
View profile  
 More options Mar 3 2010, 12:55 pm
From: Philip Hallstrom <phi...@pjkh.com>
Date: Wed, 3 Mar 2010 09:55:29 -0800
Local: Wed, Mar 3 2010 12:55 pm
Subject: Re: [Rails] How to create a UNIQUE table constraint with migrations.

>>>>> Hi.

>>>>> This must be the most obvious thing to do, but I just can't seem  
>>>>> to
>>>>> find examples of how to do this. I would like to create a table
>>>>> with a
>>>>> table unique constraint on database level.

>>>>> In deed some migration code that would generate the following SQL

>>>>> CREATE TABLE properties (
>>>>> namespace CHAR(50),
>>>>> name      CHAR(50),
>>>>> value     VARCHAR(100),
>>>>> CONSTRAINT my_constraint UNIQUE (namespace, name)
>>>>> );

>>>> create_table :properties.....
>>>>  .....
>>>> end

>>>> add_index :properties, [:namespace, :name], :unique => true

>>> After trying this and opening my interactive SQL prompt (psql), I  
>>> can
>>> see that this only creates an index on the table not a table
>>> constraint. I can still put duplicate rows in the table.

>> Hrm.  I can't...  Rails 2.3.5, Postgresql 8.4.1 (on mac, but doubt
>> that matters)

> I am so sorry. I did't do exactly as you said, explanation:
> I used

> create_table :properties do |t|
>  .....
>  t.index [:namespace, :name], :unique => true
> end

> That does NOT create an index!!! and therefore neither a constraint!!!

> I gues that is a bug in the PostgreSQL adapter.

> But when I do as you describe using add_index syntax instead it will
> create an index (AND constraint!)

> But the fact that 't.index [:namespace, :name], :unique => true' does
> not generate an index is a bug, right?

> Thanks for all help. I appreciate the time you've spent on this.

That does indeed look like a bug.  I just tried it and it doesn't  
work.  What's strange is the source code seems to say that "t.index"  
simply calls "add_index" just like if I'd done it normally.

I just tried it using MySQL as the backend and it does NOT work either.

+------------+--------------+------+-----+---------+----------------+
| Field      | Type         | Null | Key | Default | Extra          |
+------------+--------------+------+-----+---------+----------------+
| id         | int(11)      | NO   | PRI | NULL    | auto_increment |
| a          | varchar(255) | YES  |     | NULL    |                |
| b          | varchar(255) | YES  |     | NULL    |                |
| created_at | datetime     | YES  |     | NULL    |                |
| updated_at | datetime     | YES  |     | NULL    |                |
+------------+--------------+------+-----+---------+----------------+

So, at least it's not a postgresql specific bug.

You should submit a ticket to the Rails folks...

-philip


 
You must Sign in before you can post messages.
To post a message you must first join this group.
Please update your nickname on the subscription settings page before posting.
You do not have the permission required to post.