sql >> Databáze >  >> RDS >> PostgreSQL

Změňte primární klíč v tabulce PostgreSQL

Strávil jsem nějaký čas a nakonec jsem přišel s funkčním řešením.

Zveřejním jej zde pro budoucí použití.

Řešení

Nejprve máte tři tabulky (foo_table , bar_table , baz_table ), které odkazují na vaše users tabulky pomocí cizích klíčů (nazývaných user_id ve všech případech). Budete muset nahradit ID uložená v těchto sloupcích z id na another_id . Můžete to udělat takto:

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

Výše uvedené dotazy budete muset opakovat pro každou závislou tabulku.

Poté budou všechny závislé tabulky ukazovat na vaše nové another_id sloupec.

Nakonec budeme muset pouze nahradit primární klíč:

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

Můžete dokonce vypustit původní id pokud chcete.

Doufám, že to někomu pomůže.




  1. Příkaz IIF serveru SQL Server 2008 se nezdá povolený

  2. Výkon dynamického SQL vs. uložené procedury na Oracle

  3. Materializovaný pohled a tabulka se stejným názvem

  4. Docker - Postgres a pgAdmin 4 :Připojení odmítnuto