2010-05-14 41 views
21

Về cơ bản tôi muốn sử dụng uniqueidentifier theo cách tương tự như nhận dạng. Tôi không muốn chèn các giá trị vào nó, Nó chỉ nên chèn giá trị tự động, giá trị khác nhau cho mỗi hàng. Tôi không thể đặt tự động trên các cột của kiểu uniqueidentifier (thuộc tính 'autoincrement' được đặt thành false và không thể chỉnh sửa).Autoincrement uniqueidentifier

Trả lời

27

Hoặc thậm chí tốt hơn: sử dụng newsequentialid() làm mặc định cho cột UNIQUEIDENITIFER của bạn. Điều đó sẽ cung cấp cho bạn một chuỗi phần tiếp theo của GUID.

CREATE TABLE dbo.YourTable 
    (SerialID UNIQUEIDENTIFIER 
     CONSTRAINT DF_SerialID DEFAULT newsequentialid(), 
    .... (other columns)...... 
    ) 

Rắc rối là: newsequentialid là chỉ sẵn như là một cột mặc định - bạn không thể gọi nó như là một chức năng hoặc bất cứ điều gì. Nhưng điều đó dường như phù hợp với yêu cầu của bạn.

CẬP NHẬT: dường như có lỗi được xác nhận trong SQL Server Management Studio ngăn cản chỉ định newsequentialid() làm mặc định cho cột trong trình thiết kế bảng tương tác.

Xem: http://social.msdn.microsoft.com/Forums/en-US/sqltools/thread/cad8a4d7-714f-44a2-adb0-569655ac66e6

Cách giải quyết: tạo bảng của bạn mà không chỉ định bất kỳ mặc định, và sau đó gõ vào câu lệnh T-SQL này ở cửa sổ truy vấn bình thường và chạy nó:

ALTER TABLE dbo.YourTable 
    ADD CONSTRAINT DF_SerialID DEFAULT newsequentialid() FOR SerialID 

Điều đó sẽ làm lừa!

+0

Đó không phải là rắc rối chút nào đối với tôi. Câu trả lời của bạn có vẻ là những gì tôi đang tìm kiếm. Tôi sẽ thử nó :) – drasto

+0

Tôi đã nhận "Lỗi xác nhận mặc định cho Cột XY". Bạn có thể vui lòng kiểm soát mã của bạn (một lỗi đánh máy?)? – drasto

+0

@drasto: Tôi đã chạy mã đó trên SQL Server 2008 R2 trước khi tôi đăng nó - nó hoạt động. * Phiên bản * của SQL Server nào bạn có ??? Tôi loại bỏ dấu ngoặc xung quanh newsequentialid() - có thể đó là một vấn đề? Hoạt động trên 2008R2 chắc chắn là –

3

Sử dụng NewID() làm giá trị mặc định. Ít nhất đây là những gì bạn sẽ làm cho SQL Server.

+0

những thứ đó không chính xác ở bất kỳ đâu gần tuần tự/tự động tăng dần g, mặc dù ..... –

+0

Tôi đã thử điều này nhưng có vẻ như luôn tạo ra cùng một định danh (cái này: "00000000-0000-0000-0000-000000000000"). Vì vậy, khi chèn hàng thứ hai tôi nhận được lỗi (buộc chèn khóa chính đã được sử dụng) – drasto

+0

bạn nên đặt newId() trực tiếp trong định nghĩa bảng trong cơ sở dữ liệu của bạn! – MUG4N

6

Tôi đoán bạn có nghĩa là trong SQLServer và không C# ...

Đặt cột như PRIMARY KEY và ROWGUID

RowGuid http://img341.imageshack.us/img341/8867/sqlserverrowguid.png

+2

chỉ cần đảm bảo ** KHÔNG ** sử dụng làm cho nó chỉ mục nhóm trên bảng !! –

+0

Tại sao không? Tôi đang sử dụng nó trên một dự án và hoạt động tốt, mọi thứ trông bình thường, kiểm tra kế hoạch thực hiện, sắp xếp bảng, mọi thứ đều bình thường ... – BrunoLM

+1

GUID như chỉ mục nhóm là khủng khiếp xấu: kiểm tra http: //www.sqlskills. com/BLOGS/KIMBERLY/post/GUIDs-as-PRIMARY-KEY-andor-the-clustering-key.aspx - chúng dẫn đến phân mảnh trang và chỉ mục lớn –

2

Tôi nghĩ

CREATE TABLE dbo.YourTable 
(
    SerialID UNIQUEIDENTIFIER PRIMARY KEY DEFAULT newsequentialid() 
) 

là đơn giản hơn

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