PostgreSQL
 sql >> база данни >  >> RDS >> PostgreSQL

Променете първичния ключ в таблицата на PostgreSQL

Прекарах известно време и най-накрая стигнах до работещо решение.

Ще го публикувам тук за бъдещи справки.

Решение

Първо, имате три таблици (foo_table , bar_table , baz_table ), които сочат към вашите users таблица чрез външни ключове (наречени user_id във всички случаи). Ще трябва да замените идентификаторите, съхранени в тези колони от id към another_id . Ето как можете да го направите:

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

Ще трябва да повторите горните заявки за всяка зависима таблица.

След това всички зависими таблици ще сочат към вашия нов another_id колона.

В крайна сметка просто ще трябва да заменим първичния ключ:

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

Можете дори да премахнете оригиналния id колона, ако желаете.

Надявам се, че ще помогне на някого.




  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. SQL SELECT скорост int срещу varchar

  2. plpgsql CREATE FUNCTION синтактична грешка при или близо до 'CREATE'

  3. Laravel where условие - pgsql заявка

  4. MySQL колони с DEFAULT NULL - стилистичен избор, или е така?

  5. Множество бази данни в docker и docker-compose