PostgreSQL
 sql >> Cơ Sở Dữ Liệu >  >> RDS >> PostgreSQL

Thay đổi khóa chính trong bảng PostgreSQL

Tôi đã dành một thời gian và cuối cùng đã đưa ra một giải pháp hiệu quả.

Tôi sẽ xuất bản nó ở đây để tham khảo trong tương lai.

Giải pháp

Trước hết, bạn có ba bảng (foo_table , bar_table , baz_table ) đang trỏ đến users của bạn bảng bằng các khóa ngoại (được gọi là user_id trong tất cả trường hợp). Bạn sẽ cần thay thế các ID được lưu trữ trong các cột đó từ id tới another_id . Đây là cách bạn có thể làm điều đó:

-- 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ạn sẽ cần lặp lại các truy vấn trên cho mỗi bảng phụ thuộc.

Sau đó, tất cả các bảng phụ thuộc sẽ trỏ đến another_id mới của bạn cột.

Cuối cùng, chúng tôi sẽ chỉ cần thay thế khóa chính:

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

Bạn thậm chí có thể bỏ id ban đầu nếu bạn muốn.

Tôi hy vọng nó sẽ giúp ích cho ai đó.




  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. nhà cung cấp cho PostgreSQL trong .net với sự hỗ trợ cho TransactionScope

  2. Có thể lưu trữ một số 1 byte trong Postgres không?

  3. Symfony2 Doctrine - Điều khoản ILIKE cho PostgreSQL?

  4. Làm cách nào để kế thừa các đặc quyền của một vai trò?

  5. Làm cách nào để xác định cột ARRAY trong phần di chuyển Postgresql của Phần tiếp theo?