# Default value on a column w/ a sequence - Postgres

**URL:** <https://www.ruby-forum.com/t/default-value-on-a-column-w-a-sequence-postgres/128176>\
**Category:** Rails I18n\
**Created:** [February 5, 2008, 4:44pm UTC](https://www.ruby-forum.com/t/default-value-on-a-column-w-a-sequence-postgres/128176 "2008-02-05T16:44:06Z")\
**Posts on this page:** 2\
**Page:** 1

<div class="post-metadata">

**Author:** ![yetanothergeek](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/y/8e8cbc/32.png) [@yetanothergeek](https://www.ruby-forum.com/u/yetanothergeek)\
**Post date:** [February 5, 2008, 4:44pm UTC](https://www.ruby-forum.com/t/default-value-on-a-column-w-a-sequence-postgres/128176/1 "2008-02-05T16:44:06Z")

</div>

I recently modified the customer\_number field in my Users table in a  
migration:

remove\_column :users, :customer\_number  
execute “CREATE SEQUENCE user\_customer\_number\_seq MINVALUE 10000;”  
execute "ALTER TABLE users ADD customer\_number integer " +  
“DEFAULT nextval(‘user\_customer\_number\_seq’) NOT NULL UNIQUE;”

I want the default value (next in sequence) to be used when I create a  
new user. I thought Rails would handle this, but instead I’m getting:

PGError: ERROR: null value in column “customer\_number” violates  
not-null constraint

I want to keep the NOT NULL constraint. I thought about something like  
this:

before\_validation\_on\_create :set\_customer\_number

def set\_customer\_number  
cust\_no = next\_sequence\_value(‘user\_customer\_number\_seq’)  
self.customer\_number = cust\_no  
end

Although that’s not quite right. next\_sequence\_value is not defined in  
the Postgres adapter. How would I write set\_customer\_number? Or would  
removing the null constraint and relying on validates\_presence\_of  
:customer\_number be enough?

---

<div class="post-metadata">

**Author:** ![yetanothergeek](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/y/8e8cbc/32.png) [@yetanothergeek](https://www.ruby-forum.com/u/yetanothergeek)\
**Post date:** [February 5, 2008, 9:12pm UTC](https://www.ruby-forum.com/t/default-value-on-a-column-w-a-sequence-postgres/128176/2 "2008-02-05T21:12:27Z")

</div>

Chris S. wrote:

> I recently modified the customer\_number field in my Users table in a  
> migration:
> 
> remove\_column :users, :customer\_number  
> execute “CREATE SEQUENCE user\_customer\_number\_seq MINVALUE 10000;”  
> execute "ALTER TABLE users ADD customer\_number integer " +  
> “DEFAULT nextval(‘user\_customer\_number\_seq’) NOT NULL UNIQUE;”
> 
> I want the default value (next in sequence) to be used when I create a  
> new user. I thought Rails would handle this, but instead I’m getting:
> 
> PGError: ERROR: null value in column “customer\_number” violates  
> not-null constraint
> 
> I want to keep the NOT NULL constraint. I thought about something like  
> this:
> 
> before\_validation\_on\_create :set\_customer\_number
> 
> def set\_customer\_number  
> cust\_no = next\_sequence\_value(‘user\_customer\_number\_seq’)  
> self.customer\_number = cust\_no  
> end
> 
> Although that’s not quite right. next\_sequence\_value is not defined in  
> the Postgres adapter. How would I write set\_customer\_number? Or would  
> removing the null constraint and relying on validates\_presence\_of  
> :customer\_number be enough?

Ok, figured it out:

def set\_customer\_number  
customer\_number\_sequence = ‘user\_customer\_number\_seq’  
cust\_no = connection.select\_value(“select  
nextval(’#{customer\_number\_sequence}’)”)  
self.customer\_number = cust\_no  
end

Actually ended up getting rid of the null constraint, but I still need  
the above for validation in one of my models.
