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
,serial
vàbigserial
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ặcint2
/int8
tương ứng chosmallserial
/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.