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

Đổi tên bảng một cách an toàn bằng cách sử dụng các cột khóa chính nối tiếp

serial không phải là một kiểu dữ liệu thực tế. Hướng dẫn sử dụng cho biết:

Các kiểu dữ liệu smallserial , serialbigserial không phải là các loại true, mà chỉ đơn thuần là một sự tiện lợi về mặt ký hiệu để tạo các cột định danh duy nhất

Kiểu dữ liệu giả được giải quyết để thực hiện tất cả những điều này:

  • tạo một chuỗi có tên tablename_colname_seq

  • tạo cột với kiểu integer (hoặc int2 / int8 tương ứng cho smallserial / bigserial )

  • đặt cột NOT NULL DEFAULT nextval('tablename_colname_seq')

  • làm cho cột sở hữu trình tự, để cột đó tự động được xóa cùng với nó

Hệ thống không không biết liệu bạn đã làm tất cả những điều này bằng tay hay bằng kiểu dữ liệu giả serial . pgAdmin kiểm tra các tính năng được liệt kê và nếu tất cả đều được đáp ứng, tập lệnh DDL được thiết kế ngược sẽ được đơn giản hóa với serial phù hợp gõ phím. Nếu một trong các tính năng không được đáp ứng, việc đơn giản hóa này không diễn ra. Đó là điều mà pgAdmin làm. Đối với các bảng danh mục bên dưới, tất cả đều giống nhau. Không có serial nhập như vậy.

Không có cách nào để tự động đổi tên các chuỗi được sở hữu. Bạn có thể chạy:

ALTER SEQUENCE ... RENAME TO ...

như bạn đã làm. Bản thân hệ thống không quan tâm đến tên . Cột DEFAULT lưu trữ một OID ('foo_pkey_seq'::regclass ), bạn có thể thay đổi tên của trình tự mà không phá vỡ điều đó - OID vẫn giữ nguyên. Tương tự đối với các khóa ngoại và các tham chiếu tương tự bên trong cơ sở dữ liệu.

Chỉ mục ngầm định cho khóa chính được liên kết với tên của ràng buộc PK, điều này sẽ không thay đổi nếu bạn thay đổi tên của bảng. Trong Postgres 9.2 trở lên, bạn có thể sử dụng

ALTER TABLE ... RENAME CONSTRAINT ..

để khắc phục điều đó.

Cũng có thể có các chỉ mục được đặt tên trong tham chiếu đến tên bảng. Thủ tục tương tự:

ALTER INDEX .. RENAME TO  ..

Bạn có thể có tất cả các loại tham chiếu không chính thức đến tên bảng. Hệ thống không thể bắt buộc đổi tên các đối tượng có thể được đặt tên bất kỳ thứ gì bạn thích. Và nó không quan tâm.

Tất nhiên bạn không muốn làm mất hiệu lực mã SQL tham chiếu đến những tên đó. Rõ ràng, bạn không muốn thay đổi tên trong khi logic ứng dụng tham chiếu đến chúng. Thông thường, đây không phải là vấn đề đối với tên của chỉ mục, chuỗi hoặc ràng buộc, vì chúng thường không được tham chiếu bằng tên.

Postgres cũng có được một khóa trên các đối tượng trước khi đổi tên chúng. Vì vậy, nếu có giao dịch đồng thời mở có bất kỳ loại khóa nào trên các đối tượng được đề cập, RENAME của bạn hoạt động bị đình trệ cho đến khi các giao dịch đó cam kết hoặc khôi phục.

Danh mục hệ thống và OID

Lược đồ cơ sở dữ liệu được lưu trữ trong các bảng của danh mục hệ thống trong lược đồ hệ thống pg_catalog . Tất cả các chi tiết trong hướng dẫn sử dụng tại đây. Nếu bạn không biết chính xác mình đang làm gì, bạn không nên làm rối tung những bảng đó . Một lần di chuyển sai và bạn có thể phá vỡ cơ sở dữ liệu của mình. Sử dụng các lệnh DDL mà Postgres cung cấp.

Đối với một số bảng quan trọng nhất, Postgres cung cấp các kiểu định danh đối tượng và kiểu phôi để lấy tên cho OID và ngược lại một cách nhanh chóng. Như:

SELECT 'foo_pkey_seq'::regclass

Nếu tên giản đồ nằm trong search_path và tên bảng là duy nhất, cung cấp cho bạn giống như:

SELECT oid FROM pg_class WHERE relname = 'foo_pkey_seq';

Khóa chính của hầu hết các bảng danh mục là oid và trong nội bộ, hầu hết các tham chiếu sử dụng OID.




  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Tắt kiểm tra khóa ngoại PostgreSQL để di chuyển

  2. TẠO NGÔN NGỮ plpython3u - PostgreSQL 9.6

  3. 8 tính năng tương thích mới của Oracle trong EnterpriseDB PPAS 9.2 Beta

  4. Rails Resque worker không thành công với PGError:máy chủ đóng kết nối đột ngột

  5. '$$' được sử dụng để làm gì trong PL / pgSQL