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)
);
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)
);
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)
);
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)
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.
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.
Excerpt from the PostgreSQL manual:
----------------------------------
PostgreSQL automatically creates a unique index when a unique constraint
or a primary key is defined for a table. The index covers the columns
that make up the primary key or unique columns (a multicolumn index, if
appropriate), and is the mechanism that enforces the constraint.
----------------------------------
This says that an index is created whenever you create a constraint,
not that a constraint is created whenever you create an index.
Nevertheless, it seem to be a fact, that whenever you create an unique
index, it also craetes a constraint.
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)
);
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.
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)
);
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.
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)
);
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.