Depesz brought that to my attention a few days after the initial submission, and adding support for UNIQUE was not much pain. I implemented it almost immediately, but didn't announce it as I was hoping I could submit some doc changes too with that.
If you are the adventurous kind, you can follow the Git branch here: https://github.com/gurjeet/postgres/tree/replace_pkey_index Regards, On Mon, Nov 1, 2010 at 10:29 PM, Jim Nasby <j...@nasby.net> wrote: > UNIQUE constraints suffer from the same behavior; feel like fixing that > too? :) > > On Oct 9, 2010, at 1:07 PM, Gurjeet Singh wrote: > > > This is a continuation from this thread: > http://archives.postgresql.org/pgsql-hackers/2010-09/msg02153.php > > > > The attached patch allows creating a primary key using an existing index. > > > > This capability would be helpful in situations where one wishes to > rebuild/reindex the primary key, but associated downtime is not desirable. > It also allows one to create a table and start using it, while creating a > unique index 'concurrently' and later adding the primary key using the > concurrently built index. Maybe pg_dump can also use it. > > > > The command syntax is: > > > > ALTER TABLE sometable ADD PRIMARY KEY( col1, col2 ) WITH ( INDEX = > 'indexname' ); > > > > A typical use case: > > > > CREATE INDEX CONCURRENTLY new_pkey_idx ON sometable( a, b ); > > > > ALTER TABLE sometable ADD PRIMARY KEY ( a, b ) WITH (INDEX = > 'new_pkey_idx' ); > > > > - OR - > > > > ALTER TABLE sometable DROP CONSTRAINT sometable_pkey, > > ADD PRIMARY KEY ( a, b ) WITH (INDEX = 'new_pkey_idx' ); > > > > > > Notes for the reviewers: > > ------------------------ > > > > Don't be scared by the size of changes to index.c :) These are mostly > indentation diffs. I have attached two versions of the patch: one is context > diff, and the other is the same except ignoring whitespace changes. > > > > The pseudocode is as follows: > > > > In ATExecAddIndex() > > If this ALTER command specifies a PRIMARY KEY > > Call get_pkey_index_oid() to perform checks. > > > > In get_pkey_index_oid() > > Look for the WITH INDEX option > > Reject > > if more than one WITH INDEX clause specified > > if the index doesn't exist or not found in table's schema > > if the index is associated with any CONSTRAINT > > if index is not ready or not valid (CONCURRENT buiild? Canceled > CONCURRENT?) > > if index is on some other table > > if index is not unique > > if index is an expression index > > if index is a partial index > > if index columns do not match the PRIMARY KEY clause in the > command > > if index is not B-tree > > If PRIMARY KEY clause doesn't have a constraint name, assign it one. > (code comments explain why) > > Rename the index to match constraint name in the PRIMARY KEY clause > > > > Back in ATExecAddIndex() > > Use the index OID returned by get_pkey_index_oid() to tell > DefineIndex() to not create index. > > Now mark the index as having 'indisprimary' flag. > > > > In DefineIndex() and index_create() APIs > > pass an additional flag: index_exists > > Skip various actions based on this flag. > > > > > > The patch contains a few tests, and doesn't yet have a docs patch. > > > > The development branch is at > http://github.com/gurjeet/postgres/tree/replace_pkey_index > > > > Regards, > > -- > > gurjeet.singh > > @ EnterpriseDB - The Enterprise Postgres Company > > http://www.EnterpriseDB.com > > > > singh.gurj...@{ gmail | yahoo }.com > > Twitter/Skype: singh_gurjeet > > > > Mail sent from my BlackLaptop device > > <add_pkey_with_index.patch><add_pkey_with_index.ignore_ws.patch> > > -- > > Sent via pgsql-hackers mailing list (pgsql-hackers@postgresql.org) > > To make changes to your subscription: > > http://www.postgresql.org/mailpref/pgsql-hackers > > -- > Jim C. Nasby, Database Architect j...@nasby.net > 512.569.9461 (cell) http://jim.nasby.net > > > -- gurjeet.singh @ EnterpriseDB - The Enterprise Postgres Company http://www.EnterpriseDB.com singh.gurj...@{ gmail | yahoo }.com Twitter/Skype: singh_gurjeet Mail sent from my BlackLaptop device