119

In my PostgreSQL database I have a unique index created this way:

CREATE UNIQUE INDEX <my_index> ON <my_table> USING btree (my_column)

Is there way to alter the index to remove the unique constraint? I looked at ALTER INDEX documentation but it doesn't seem to do what I need.

I know I can remove the index and create another one, but I'd like to find a better way, if it exists.

4 Answers 4

167

You may be able to remove the unique CONSTRAINT, and not the INDEX itself.

Check your CONSTRAINTS via select * from information_schema.table_constraints;

Then if you find one, you should be able to drop it like:

ALTER TABLE <my_table> DROP CONSTRAINT <constraint_name>

Edit: a related issue is described in this question

Sign up to request clarification or add additional context in comments.

5 Comments

Thanks for the suggestion. Unfortunately there are no such constraints.
Yeah, I thought of this too, but checked it in Postgres... adding a unique index does not add a constraint to the table... it seems to be part of the index itself.
@dcsohl Yep. This is interesting, I looked into it and according to this question unique constraints can create indexes (but not the other way around)
@SergeyPotapov This answer does not solve the problem posed by your question. Could you revisit this question and select the correct answer?
Does not work - says that constraint does not exists.
56

Assume you have the following:

Indexes:
    "feature_pkey" PRIMARY KEY, btree (id, f_id)
    "feature_unique" UNIQUE, btree (feature, f_class)
    "feature_constraint" UNIQUE CONSTRAINT, btree (feature, f_class)

To drop the UNIQUE CONSTRAINT, you would use ALTER TABLE:

ALTER TABLE feature DROP CONSTRAINT feature_constraint;

To drop the PRIMARY KEY, you would also use ALTER TABLE:

ALTER TABLE feature DROP CONSTRAINT feature_pkey;

To drop the UNIQUE [index], you would use DROP INDEX:

DROP INDEX feature_unique;

7 Comments

Does not work either. Index "does not exists" but cannot be created again because "relation "<name>" already exists:
@niedomnie That is a different problem. You need to check your schema for other relations (e.g. table names) with the same name. See related topic stackoverflow.com/a/8835441/2074605
will constraint occupy memory ?
@KIRANKUMARMATAM No, adding or removing a constraint will not have any direct, measurable impact on memory consumption in PostgreSQL. The only exception might be deferred constraints, which are applied at the end of a transaction, and that would be entirely dependent on your particular database.
@vallismortis thanks for reply what i meant here is space in db ?
|
7

I don't think it's possible... even in the pgAdmin III UI, if you try to edit a constraint created with your statement, the "Unique" box is greyed-out; you can't change it through the UI. Combined with your research on the ALTER INDEX docs, I'd say it can't be done.

Comments

-1

Searched for hours for the same quesiton and doesnt seem to get a right answer---- all the given answers just failed to work.

For not null, it also took me some time to find. Apparently for some reason, the majority-certified codes just dont work when I use it.

I got the not null version code, something like this

ALTER TABLE tablename
ALTER COLUMN column_want_to_remove_constriant
DROP NOT NULL

Sadly changing 'not null' to 'unique' doesnt work.

1 Comment

This seems not to be related to the question which asked for changing an index.

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.