Tại sao bảng SQL Server không thể có nhiều hơn một cột IDENTITY?


7

Tại sao bảng SQL Server không thể có nhiều hơn một cột danh tính?

CREATE TABLE t(id INT IDENTITY, id2 INT IDENTITY)

Msg 2744, Cấp 16, Trạng thái 2, Dòng 5
Nhiều cột nhận dạng được chỉ định cho bảng 't'.
Chỉ có một cột nhận dạng trên mỗi bảng được cho phép.

Tôi hiểu chúng ta có thể giải quyết nó bằng cột được tính toán.

Theo tài liệu sản phẩm, một bảng không thể có nhiều hơn một cột nhận dạng. Nhưng tại sao? Lý do thực sự đằng sau nó là gì?

Câu trả lời:


15

Tôi không nghĩ rằng có bất kỳ lý do "nội bộ" thực sự. Siêu dữ liệu được lưu trữ ở cấp cột chứ không phải cấp bảng. Nó sẽ cần suy nghĩ lại mặc dù các hàm vô hướng như scope_identity()và cú pháp cột giả $identitynhư bây giờ sẽ có sự mơ hồ.

Về mặt triết học nếu mục đích của identityviệc tạo ra một cái gì đó xác định duy nhất một thực thể tại sao bạn lại cần hai giá trị tính toán tùy ý khác nhau đóng vai trò đó?

Và lợi ích ở đâu? Đây là một bản sao trang web chéo vì vậy tôi sẽ lặp lại ví dụ của tôi từ SO .

Cột Danh tính trong SQL Server có hạt giống và gia tăng tự động. Chúng ta luôn có thể tính toán giá trị id giả định thứ 2 là gì nếu chúng ta biết giá trị của cột id đầu tiên.

ví dụ: Nếu đây là cú pháp hợp pháp

create table #foo
(
bar int identity(1,10),
baz int identity(1000,1)
)

Chúng tôi sẽ không cần lưu trữ baz vì nó có thể được tính từ thanh như sau.

baz = 1000 + (bar-1)/10

Kể từ SQL Server 2012, bạn có thể tự loại mình ra và thêm bao nhiêu cột bằng cách sử dụng mặc định theo trình tự như bạn muốn vào một bảng. Ví dụ:

CREATE SEQUENCE dbo.Sequence1 
    AS integer 
    START WITH 1 
    INCREMENT BY 1 
    MAXVALUE 1000 
    CYCLE 
    CACHE 50;

CREATE SEQUENCE dbo.Sequence2 
    AS decimal(5,0) 
    START WITH 5
    INCREMENT BY 10
    MAXVALUE 250 
    CYCLE 
    CACHE 50;

CREATE TABLE dbo.T
(
    id integer NOT NULL DEFAULT NEXT VALUE FOR dbo.Sequence1, 
    id2 decimal(5,0) NOT NULL DEFAULT NEXT VALUE FOR dbo.Sequence2, 
);

INSERT dbo.T DEFAULT VALUES;
INSERT dbo.T DEFAULT VALUES;
INSERT dbo.T DEFAULT VALUES;

SELECT * FROM dbo.T;

DROP TABLE dbo.T;

DROP SEQUENCE 
    dbo.Sequence1, 
    dbo.Sequence2;

Các kết quả

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.