PostgreSQL
 sql >> Teknologi Basis Data >  >> RDS >> PostgreSQL

Ubah kunci utama di tabel PostgreSQL

Saya telah menghabiskan beberapa waktu dan akhirnya menemukan solusi yang berhasil.

Saya akan mempublikasikannya di sini untuk referensi di masa mendatang.

Solusi

Pertama-tama, Anda memiliki tiga tabel (foo_table , bar_table , baz_table ) yang menunjuk ke users Anda tabel dengan menggunakan kunci asing (disebut user_id dalam semua kasus). Anda harus mengganti ID yang disimpan di kolom tersebut dari id ke another_id . Berikut cara melakukannya:

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

Anda perlu mengulang kueri di atas untuk setiap tabel dependen.

Setelah itu, semua tabel dependen akan mengarah ke another_id baru Anda kolom.

Pada akhirnya kita hanya perlu mengganti kunci utama:

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

Anda bahkan dapat menjatuhkan id asli kolom jika Anda mau.

Saya harap ini akan membantu seseorang.




  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Versi PostgreSQL mana yang saya jalankan?

  2. Kesalahan SALINAN PG:sintaks input tidak valid untuk bilangan bulat

  3. Permintaan rekaman terbaru yang efisien dengan Postgresql

  4. OPENXML di Postgres

  5. Pernyataan yang Disiapkan Sudah Ada