sql >> Database >  >> RDS >> PostgreSQL

Primaire sleutel wijzigen in PostgreSQL-tabel

Ik heb wat tijd besteed en kwam uiteindelijk met een werkende oplossing.

Ik zal het hier publiceren voor toekomstig gebruik.

Oplossing

Allereerst heb je drie tabellen (foo_table , bar_table , baz_table ) die verwijzen naar uw users tabel door middel van externe sleutels (genaamd user_id in alle gevallen). U moet de ID's die in die kolommen zijn opgeslagen, vervangen door id naar another_id . Hier is hoe je het kunt doen:

-- 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;

U moet de bovenstaande vragen herhalen voor elke afhankelijke tabel.

Daarna zullen alle afhankelijke tabellen verwijzen naar uw nieuwe another_id kolom.

Uiteindelijk hoeven we alleen de primaire sleutel te vervangen:

-- 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

Je kunt zelfs de originele id laten vallen kolom als je wilt.

Ik hoop dat het iemand zal helpen.




  1. ResultSet sluiten maar PreparedStatement niet sluiten

  2. Hoe kolommen in een MySQL-tabel te verplaatsen?

  3. Is er een FIND_IN_SET op index in MySQL?

  4. PostgreSQL DISTINCT ON met verschillende ORDER BY