2013-02-11 21 views
12

Tôi đang cập nhật cơ sở dữ liệu của mình để có một cột cho GUID cho mỗi bản ghi trong bảng.Tạo GUID mới trong SQL Server nếu không được cung cấp

Bảng này được điền bởi nhiều nguồn khác nhau và một số trong số chúng sẽ không cung cấp GUID cho hồ sơ mới.

Làm cách nào tôi có thể điền cột này bằng newid() ở phía DB nếu không có giá trị nào được chuyển vào cho bản ghi mới?

+2

Đặt mặc định cho cột là 'NEWID()'? – Kermit

+0

vì vậy nếu một giá trị không tồn tại, thì NEWID() sẽ điền vào nó và không ghi đè lên nó? – Slee

Trả lời

23

KHÔNG I REPEAT KHÔNG NƠI MỘT TRẬN DEFAULT OF NEWID(). Nếu bạn làm GUID bạn nhận được sẽ được hoàn toàn ngẫu nhiên và nếu bạn có bất kỳ loại lập chỉ mục trên cột này nó sẽ là vô dụng. Nếu bạn định thực hiện điều này, bạn muốn đặt cột mặc định là NEWSEQUENTIALID ()

Kimberly Tripp có Great ArticleGreat Article về chủ đề này.

Thực hiện NEWSEQUENTIALID () như một mặc định:

CREATE TABLE foo 
(unq_id UNIQUEIDENTIFIER DEFAULT NEWSEQUENTIALID(), 
cola varchar(10)); 

Full SQL Fiddle example..

+1

Có, điều này là tốt hơn, nhưng lưu ý rằng nó sẽ không giúp trường hợp hầu hết các GUID đến từ các ứng dụng (và những người hiểu biết làm thế nào chúng được tạo ra). –

+0

Không có chỉ mục trên bảng này và tôi không quan tâm nếu nó là tuần tự. Cuối cùng tôi sẽ luôn luôn cung cấp giá trị GUID và điều này có thể đến từ một hệ thống khác nhau, nơi nó là một giá trị duy nhất và không phải luôn luôn là một GUID vì vậy tôi có lĩnh vực này như một NVARCHAR để làm cho nó linh hoạt hơn một chút. – Slee

+3

Để nói rằng chỉ mục là vô ích là khá căng. Có một chỉ mục có vấn đề phân mảnh vẫn còn tốt hơn nhiều để * không * có một chỉ mục cần thiết. Nhưng vẫn +1 cho giải pháp hợp lệ. –

5

Bạn có thể đặt giá trị mặc định cho cột thành NEWID(). Sau đó, một GUID sẽ được tạo ra và chỉ được gán nếu một chưa được.

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