2010-09-27 33 views
5

"Chỉ có thể có một cột IDENTITY cho mỗi bảng""Chỉ có thể có một cột IDENTITY trên mỗi bảng" - Tại sao?

Tại sao lại như vậy? Có một kịch bản của một chiếc xe, có tồn tại một số chasis đó là duy nhất cũng như số lượng đăng ký mà hóa ra là duy nhất. Để mô tả trường hợp này trong máy chủ sql, chúng tôi cần triển khai tùy chỉnh cho trên các cột. Ngược lại, trong Oracle bạn có thể có bao nhiêu trình tự như bạn muốn trên một bảng. Tại sao có một hạn chế trên cột IDENTITY, bất kỳ lý do cụ thể nào?

Tình huống có sơ đồ phương tiện là điều gì đó tưởng tượng đang tự hỏi mình là tại sao có hạn chế về cột nhận dạng.

+1

Có thực sự quan trọng không? –

+0

Tôi muốn biết tại sao điều đó là không thể. – Chaitanya

+2

Bởi vì các kỹ sư trong nhóm SQL Server hoặc không thể làm điều đó, hoặc không nghĩ rằng đó là một ý tưởng tốt để làm điều đó. –

Trả lời

8

Cột nhận dạng trong SQL Server có hạt và tăng tự động. Chúng tôi luôn có thể tính toán giá trị giả định thứ 2 sẽ là gì nếu chúng tôi 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 không cần lưu trữ baz vì nó có thể được tính từ thanh như sau.

baz = 1000 + (bar-1)/10 
+1

darn bạn cho khớp nối những gì tôi đã cố gắng để nói! – DForck42

2

Dữ liệu được lưu trữ trong cơ sở dữ liệu, được khóa bởi cột IDENTITY. Một cột như vậy cho phép lưu trữ giống như hệ thống tập tin. Có nhiều cột IDENTITY sẽ gây nhầm lẫn cho vấn đề.

Đề xuất của tôi là chọn một trong các cột của bạn là IDENTITY hoặc PRIMARY KEY và người khác là UNIQUE KEY. Là một người dùng sẽ không có sự khác biệt, nhưng nó sẽ làm cho DBMS hạnh phúc.

5

Vì nó sẽ có cùng giá trị. nếu bạn đã có bản sắc (1,1) là chính, và bản sắc (100,2), bạn sẽ nhận được những kết quả này:

1  100 
2  102 
3  104 
4  106 
5  108 
6  110 
7  112 
8  114 
9  116 
10 118 

bạn có thể nhận được cột thứ hai bằng cách làm này:

((ID-1) * 2) +100

đó là phương trình tuyến tính, vì vậy điểm nào khác với điểm hiển thị?

+0

Suy nghĩ của tôi chính xác. – ErikE

+0

Giá trị IDENTITY không phải lúc nào cũng được gán theo thứ tự. Nếu bạn có hai lần chèn đồng thời nhiều hàng thì các giá trị có thể được xen kẽ giữa hai tập hợp các hàng. Ngoài ra, các giá trị cụ thể có thể được chèn để hai cột không phụ thuộc lẫn nhau. Chỉ cần một vài lý do tại sao bạn có thể muốn hai cột IDENTITY. – sqlvogel

+1

@dportas, chắc chắn, nhưng về lý thuyết, nếu bạn có 2 danh tính, cả hai đều sẽ được chỉ định cùng một lúc, vẫn cho bạn hiệu quả tương tự. – DForck42

1
  • Chuỗi Oracle không phải là cột SQL Server IDENTITY: bạn viết một số mã cho chúng. Họ không làm việc ra khỏi hộp dựa trên CREATE TABLE DDL
  • Bất kỳ cột SẮC tiếp theo có thể được làm việc ra khỏi đầu tiên (chỉnh sửa: như dân gian khác được đề cập)
0

Đó là một hạn chế ngớ ngẩn Tôi đồng ý. Nó không phải là quá khó khăn để làm việc xung quanh nó mặc dù. Chỉ cần tạo một bảng riêng biệt với một cột IDENTITY để sử dụng hoàn toàn như một trình tạo chuỗi. Chèn vào bảng thứ tự, lấy giá trị bằng cách sử dụng SCOPE_IDENTITY() và sau đó chèn giá trị bất cứ nơi nào bạn muốn. Sau đó, bạn có thể hỗ trợ bao nhiêu chuỗi tùy thích.

1

Lý do không được giải thích trong MSDN mà tôi có thể tìm thấy.Tuy nhiên, tôi nghi ngờ rằng nó đã làm với cách máy chủ sql thực hiện cột nhận dạng. Về mặt khái niệm, tôi nghĩ rằng đó là một thiết lập hoặc giá trị ở cấp độ bảng nhiều hơn ở cấp cột và cột chỉ là một cách để truy cập vào giá trị. Tôi nghĩ rằng điều này bởi vì tất cả các phương pháp để tương tác với các giá trị nhận dạng có bảng như một tham số và không phải là cột ví dụ. IDENT_SEED, IDENT_CURRENT và IDENT_INCR. Nếu đó là cài đặt cấp cột, các thông số sẽ bao gồm tên cột. Nếu bạn có nhiều cột nhận dạng trên bàn, các chức năng đó sẽ không hoạt động.

Tôi chỉ đang suy đoán.

Các vấn đề liên quan