sql >> Database teknologi >  >> RDS >> PostgreSQL

Skift primær nøgle i PostgreSQL-tabel

Jeg har brugt noget tid og kom endelig med en fungerende løsning.

Jeg vil offentliggøre det her til fremtidig reference.

Løsning

Først og fremmest har du tre tabeller (foo_table , bar_table , baz_table ), som peger på dine users tabel ved hjælp af fremmednøgler (kaldet user_id i alle tilfælde). Du skal erstatte de id'er, der er gemt i disse kolonner fra id til another_id . Sådan kan du gøre det:

-- We are dropping the foreign key constraint on dependant table (in other case it will prevent us from updating the values)
ALTER TABLE foo_table DROP CONSTRAINT fk_e52ffdeea76ed395;

-- Then, we're swapping values in foreign key column from id to another_id
UPDATE foo_table T SET user_id = (SELECT another_id FROM users WHERE id = T.user_id);

-- And finally we're creating new foreign key constraint pointing to the another_id instead of id
ALTER TABLE foo_table ADD CONSTRAINT fk_e52ffdeea76ed395 FOREIGN KEY (user_id) REFERENCES users (another_id) ON DELETE CASCADE;

Du bliver nødt til at gentage ovenstående forespørgsler for hver afhængig tabel.

Derefter vil alle afhængige tabeller pege på din nye another_id kolonne.

I sidste ende skal vi bare erstatte den primære nøgle:

-- 1. Dropping the original primary key
ALTER TABLE users DROP CONSTRAINT users_pkey

-- 2. Renaming existing index for another_id (optional)
ALTER INDEX uniq_1483a5e93414710b RENAME TO users_pkey

-- 3. Creating new primary key using existing index for another_id
ALTER TABLE users ADD PRIMARY KEY USING INDEX users_pkey

-- 4. Creating index for old id column (optional)
CREATE UNIQUE INDEX users_id ON users (id)

-- 5. You can drop the original sequence generator if you won't need it
DROP SEQUENCE users_id_seq

Du kan endda droppe det originale id kolonne, hvis du vil.

Jeg håber, det vil hjælpe nogen.




  1. Mysql Lagring af en variabel med resultatet af en SELECT CASE

  2. Mysql rækkefølge efter specifikke ID-værdier

  3. MySQL ANTAL af flere venstre joinforbindelser - optimering

  4. MS SQL ping ekstern server