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

Cách tạo cột nhận dạng tương đương của SQL Server trong Postgres

tl; dr

Bây giờ trong Postgres 10, hãy chỉ định GENERATED BY DEFAULT AS IDENTITY theo tiêu chuẩn SQL.

create table tower 
(
  npages integer, 
  ifnds integer, 
  ifnid integer, 
  name varchar(20), 
  towid integer GENERATED BY DEFAULT AS IDENTITY    -- per SQL standard
)

Cột nhận dạng

Postgres 10 hiện hỗ trợ khái niệm cột danh tính và sử dụng cú pháp SQL chuẩn. Mặc dù tôi không phải là chuyên gia về MS SQL Server, nhưng tôi tin rằng hỗ trợ tiêu chuẩn mới này là tương đương.

GENERATED … AS IDENTITY

GENERATED … AS IDENTITY lệnh được sử dụng trong CREATE TABLE tạo ra một chuỗi ngầm định. Việc tạo, đặt tên, quyền và thả chuỗi đó là minh bạch đối với bạn, không giống như với SERIAL . Bây giờ rất trực quan. Nếu bạn cấp quyền sử dụng cho bảng, họ sẽ có quyền cho trình tự. Nếu bạn bỏ bảng, trình tự sẽ tự động bị loại bỏ.

Hai hương vị của cú pháp tiêu chuẩn. Sự khác biệt chỉ quan trọng nếu bạn chuyển một giá trị thay vì để một giá trị được tạo ra. Thông thường, mọi người luôn dựa vào giá trị được tạo, vì vậy thông thường bạn sẽ chỉ cần sử dụng phiên bản đầu tiên, GENERATED BY DEFAULT AS IDENTITY .

  • GENERATED BY DEFAULT AS IDENTITY
    • Tạo một giá trị trừ khi INSERT lệnh cung cấp một giá trị.
  • GENERATED ALWAYS AS IDENTITY
    • Bỏ qua bất kỳ giá trị nào được cung cấp bởi INSERT trừ khi chỉ định OVERRIDING SYSTEM VALUE

Xem CREATE TABLE trang cho tài liệu.

Đọc trang thú vị này của Peter Eisentraut. Anh ấy giải thích một số vấn đề kỳ lạ với SERIAL . Không có vấn đề như vậy với tính năng cột danh tính mới. Vì vậy, không có lý do gì để sử dụng SERIAL nữa, không có nhược điểm, chỉ có thăng trầm; SERIAL được thay thế bởi GENERATED … AS IDENTITY .

Lưu ý rằng cột nhận dạng không nhất thiết phải là khóa chính và không được lập chỉ mục tự động. Vì vậy, bạn vẫn cần chỉ định PRIMARY KEY rõ ràng nếu đó là ý định của bạn (như trường hợp thường xảy ra).

CREATE TABLE person_ (

    id_ 
        INTEGER 
        GENERATED BY DEFAULT AS IDENTITY   -- Replaces SERIAL. Implicitly creates a SEQUENCE, specified as DEFAULT.
        PRIMARY KEY                        -- Creates index. Specifies UNIQUE. Marks column for relationships.
        ,

    name_ 
        VARCHAR( 80 )

) ;

Mục đích là để ẩn các chi tiết triển khai nội bộ với bạn. Bạn không cần phải biết tên của trình tự được tạo dưới các trang bìa. Ví dụ:bạn có thể đặt lại bộ đếm qua cột mà không cần biết trình tự bên dưới.

ALTER TABLE person_ 
    ALTER COLUMN id_ 
    RESTART WITH 1000      -- Reset sequence implicitly, without a name.
;

Chỉ định rõ danh tính:

  • Đánh dấu cột NOT NULL
  • Tạo một chuỗi
    • Loại trình tự khớp với cột (32-bit 64-bit, v.v.)
  • Liên kết chuỗi với cột
    • Kế thừa các quyền
    • Các tầng giảm xuống
    • Vẫn được gắn với cột ngay cả khi cột được đổi tên
  • Chỉ định trình tự làm nguồn giá trị mặc định cho cột đó

Cột danh tính có thể có các tùy chọn tương tự như CREATE SEQUENCE :

  • START WITH start
  • MINVALUE minvalue | NO MINVALUE
  • MAXVALUE maxvalue | NO MAXVALUE
  • INCREMENT [ BY ] increment
  • CYCLE | NO CYCLE
  • CACHE bộ nhớ cache
  • OWNED BY NONE
    (việc chỉ định quyền sở hữu cho cột danh tính không có ý nghĩa gì đối với tôi vì quyền sở hữu được quản lý tự động)

Ví dụ ngớ ngẩn về các tùy chọn:

id_ INTEGER 
GENERATED BY DEFAULT AS IDENTITY ( 
    START WITH 200 
    MINVALUE 100 
    MAXVALUE 205 
    CYCLE 
    INCREMENT BY 3 
) PRIMARY KEY

Thêm 4 hàng:



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. postgres array_agg LỖI:không thể tích lũy các mảng có kích thước khác nhau

  2. Hướng dẫn về PGpool - Gợi ý &Quan sát:Phần ba

  3. Tại sao postgis của tôi không sử dụng chỉ mục trên trường hình học?

  4. Im lặng postgres nhật ký thư rác trong rails 3 nhật ký

  5. Ebean tìm kiếm tên chuỗi sai trong Play Framework 2