PostgreSQL
 sql >> Baza danych >  >> RDS >> PostgreSQL

Zmień klucz podstawowy w tabeli PostgreSQL

Spędziłem trochę czasu i wreszcie wymyśliłem działające rozwiązanie.

Opublikuję go tutaj do wykorzystania w przyszłości.

Rozwiązanie

Przede wszystkim masz trzy tabele (foo_table , bar_table , baz_table ), które wskazują na Twoich users tabela za pomocą kluczy obcych (o nazwie user_id we wszystkich przypadkach). Będziesz musiał zastąpić identyfikatory przechowywane w tych kolumnach z id na another_id . Oto jak możesz to zrobić:

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

Będziesz musiał powtórzyć powyższe zapytania dla każdej tabeli zależnej.

Następnie wszystkie zależne tabele będą wskazywać na Twój nowy another_id kolumna.

Na koniec wystarczy wymienić klucz podstawowy:

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

Możesz nawet upuścić oryginalny id kolumnę, jeśli chcesz.

Mam nadzieję, że komuś pomoże.




  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. przechowuj wynik postgresql w zmiennej bash

  2. Obliczenia n-tego percentyla w postgresql

  3. Czy zrzut Postgresql tworzy sekwencje, które zaczynają się od ostatniego klucza lub po nim?

  4. Dlaczego PostgreSQL traktuje moje zapytanie inaczej w funkcji?

  5. GeoDjango w systemie Windows:Nie można znaleźć biblioteki GDAL / OSError:[WinError 126] Nie można znaleźć określonego modułu