Search Postgresql Archives

Re: Replacing an existing unique constraint (not UNIQUE INDEX) with primary key

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



On 12/20/2016 03:03 AM, Andreas Joseph Krogh wrote:
På tirsdag 20. desember 2016 kl. 11:42:56, skrev Achilleas Mantzios
<achill@xxxxxxxxxxxxxxxxxxxxx <mailto:achill@xxxxxxxxxxxxxxxxxxxxx>>:

    On 20/12/2016 12:27, Andreas Joseph Krogh wrote:
    På tirsdag 20. desember 2016 kl. 11:02:27, skrev Achilleas
    Mantzios <achill@xxxxxxxxxxxxxxxxxxxxx
    <mailto:achill@xxxxxxxxxxxxxxxxxxxxx>>:

        On 20/12/2016 11:43, Andreas Joseph Krogh wrote:
        [snip]
        BEGIN;
        ALTER TABLE person ADD CONSTRAINT person_pk PRIMARY KEY
        (entity_id);
        alter table person drop constraint person_entity_id_key CASCADE;
        alter table phone add CONSTRAINT phone_fk FOREIGN KEY
        (person_entity_id) REFERENCES person(entity_id);
        alter table address add CONSTRAINT address_fk FOREIGN KEY
        (person_id) REFERENCES person(entity_id);
        COMMIT;


    Yea, I was hoping to avoid having to manually add the FK's to the
    referencing tables (34).
    Is there really no way to accomplish this without DROP CONSTRAINT
    ...  CASCADE, hacking the system-catalogs or something?

    You may write a script to output those 34 FK constraints. Definitely
    safer than hacking pg_constraint.conindid


Yes.

I'd still argue that what I'm trying to do should "just work" as PG
treats UNIQUE CONSTRAINT and UNIQUE INDEX the same wrt. the planner and
FK-enforcement.

Close as I can come:

test=# ALTER TABLE person
    ADD CONSTRAINT person_pkey PRIMARY KEY (entity_id);
ALTER TABLE


test=# \d person
           Table "public.person"
  Column   |       Type        | Modifiers
-----------+-------------------+-----------
 entity_id | bigint            | not null
 name      | character varying | not null
Indexes:
    "person_pkey" PRIMARY KEY, btree (entity_id)
    "person_entity_id_key" UNIQUE CONSTRAINT, btree (entity_id)
Referenced by:
TABLE "address" CONSTRAINT "address_person_id_fkey" FOREIGN KEY (person_id) REFERENCES person(entity_id) TABLE "phone" CONSTRAINT "phone_person_entity_id_fkey" FOREIGN KEY (person_entity_id) REFERENCES person(entity_id)


Though you cannot DROP the original constraint index until you change what the FKs point to. It buys you time to do that though.

test=# ALTER TABLE person DROP CONSTRAINT person_entity_id_key;
ERROR: cannot drop constraint person_entity_id_key on table person because other objects depend on it DETAIL: constraint phone_person_entity_id_fkey on table phone depends on index person_entity_id_key constraint address_person_id_fkey on table address depends on index person_entity_id_key
HINT:  Use DROP ... CASCADE to drop the dependent objects too.



--
*Andreas Joseph Krogh*
CTO / Partner - Visena AS
Mobile: +47 909 56 963
andreas@xxxxxxxxxx <mailto:andreas@xxxxxxxxxx>
www.visena.com <https://www.visena.com>
<https://www.visena.com>



--
Adrian Klaver
adrian.klaver@xxxxxxxxxxx


--
Sent via pgsql-general mailing list (pgsql-general@xxxxxxxxxxxxxx)
To make changes to your subscription:
http://www.postgresql.org/mailpref/pgsql-general



[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[Index of Archives]     [Postgresql Jobs]     [Postgresql Admin]     [Postgresql Performance]     [Linux Clusters]     [PHP Home]     [PHP on Windows]     [Kernel Newbies]     [PHP Classes]     [PHP Books]     [PHP Databases]     [Postgresql & PHP]     [Yosemite]
  Powered by Linux