2010-03-16 7 views
5

Tôi đang sử dụng DB2 v9 trên LUW.Làm cách nào để nhận giá trị tiếp theo sẽ được sử dụng trên cột IDENTITY

Tôi có một cột được định nghĩa như thế này:

"ID" BIGINT NOT NULL GENERATED BY DEFAULT
AS IDENTITY (START WITH 1, INCREMENT BY 1, CACHE 20,
NO MINVALUE, NO MAXVALUE, NO CYCLE, NO ORDER),

Tôi muốn biết cách tốt nhất để xác định những giá trị tiếp theo sẽ là cho cột ID thời gian tới một kỷ lục được chèn vào bảng .

Tôi sẽ sử dụng thông tin này để viết tập lệnh để thực hiện kiểm tra "độ sáng" trên bảng mà IDENTITY vẫn còn nguyên và giá trị tiếp theo lớn hơn giá trị cao nhất trong cột ID.

Tôi không muốn chỉ đặt lại giá trị một cách mù quáng. Nếu bảng không vượt qua kiểm tra sanity tôi muốn được thông báo để tôi có thể xác định những gì gây ra IDENTITY là "wacked".

+0

Đây là bài kiểm tra ngoại tuyến được thực hiện trong khi cơ sở dữ liệu không được sử dụng khác. Không có vấn đề gì với những người chèn bản ghi xóa trong khi thử nghiệm đang chạy. –

Trả lời

1

Bạn không thể xác định danh tính tiếp theo. Ngay cả khi bạn có thể chạy nguy cơ dữ liệu không đồng bộ vào thời điểm bạn cố tạo bản ghi mới. Điều duy nhất cần làm là tạo một bản ghi mới và nhận danh tính mới, thực hiện kiểm tra của bạn và sau đó cập nhật bản ghi với phần còn lại của dữ liệu.

Bạn có thể sử dụng SELECT IDENT_CURRENT ('yourtablename') để tạo phiên bản mới nhất. Điều này có cùng cảnh báo như trên. Điều đó làm việc trong T-SQL, không chắc chắn trong hương vị DB2.

+0

Tôi không nghĩ rằng danh tính trước đó sẽ hoạt động vì trong trường hợp tải mới có thể không có nhận dạng trước đó. Trừ khi một reseed cũng đặt bản sắc trước đó? –

+0

Ý tưởng tạo bản ghi mới của bạn có thể hoạt động. Tôi không muốn điền vào bản ghi mặc dù. Đây chỉ là một kiểm tra và không tham gia vào việc tạo hồ sơ. Tôi có thể tạo một bản ghi mới, nhận giá trị của cột xác định, sau đó thực hiện khôi phục. Có ai biết nếu làm một rollback cũng có một rollback về giá trị hạt giống? Tôi không muốn tăng giá trị hạt giống mỗi khi tôi chạy thử nghiệm. –

+0

Đây là con đường để đi. Đừng lo lắng về những khoảng trống. Ngay cả với số nguyên 32 bit không dấu, bạn có thể chèn 1000 hàng mỗi giây, 24 giờ mỗi ngày, trong 136 năm trước khi hết. –

1

Tôi không nghĩ rằng điều này sẽ hoạt động như bạn mong đợi. Hãy xem xét trường hợp một hàng được chèn vào, sau đó trước khi một hàng khác được chèn vào, hàng đó sẽ bị xóa. Tại thời điểm đó, id được tạo tự động sẽ là (ít nhất) 2 lớn hơn giá trị cao nhất trong DB và nó sẽ chính xác. Nếu bạn có thể đảm bảo rằng không có việc xóa nào xảy ra, nó có thể hoạt động, nhưng tôi không chắc chắn việc sử dụng nó sẽ là gì.

Về cơ bản, bạn đang kiểm tra xem các hoạt động cơ bản của phần mềm DB có hoạt động hay không, nếu không, bạn sẽ làm gì? Thay đổi nhà cung cấp?

Nếu trường hợp đó là bạn chỉ muốn chèn sẵn cột nhận dạng, sau đó thực hiện chọn tối đa (id) và chèn sẵn cột trong cùng một giao dịch. Bạn có thể chắc chắn rằng không có bản ghi mới nào được chèn vào trong khi cột đang được chèn sẵn bằng cách thực thi ngữ nghĩa giao dịch mức cô lập tuần tự.

+0

Tôi không kiểm tra xem các hoạt động cơ bản của DB2 có đang hoạt động hay không. Một ví dụ về những gì tôi có thể nắm bắt là một hoạt động tải không đúng thực hiện. Tôi có thể chạy kịch bản của tôi mỗi ngày trước khi bắt đầu kinh doanh.Nếu tôi tìm thấy một vấn đề, sau đó tôi có thể theo dõi ai/những gì đã thay đổi bảng bị ảnh hưởng và có một cuộc thảo luận về cách thích hợp để tải dữ liệu. Tôi sẽ rất vui khi nhận được một vài thông tin sai về mặt tích cực đối với trường hợp dữ liệu bị xóa. Nếu tôi nhận được quá nhiều xác thực sai, tôi chỉ có thể kiểm tra phạm vi lớn hơn 1. –

+0

@Michael - vì vậy điều bạn đang nói là ai đó có thể bật tính năng chèn danh tính, sau đó quên đặt lại cột để đặt cột cao hơn id họ chèn sau đó? Bạn có thể kiểm tra điều này bằng cách đọc giá trị id tối đa, thực hiện chèn bằng dữ liệu "hợp lệ", kiểm tra xem nó có thành công hay không và có id lớn hơn id bạn quan sát, sau đó xóa hàng đó - tất cả trong một giao dịch. Điều này sẽ giới thiệu một vài "trống" id trong chuỗi, nhưng sẽ phát hiện các loại vấn đề tôi đã mô tả. – tvanfosson

+0

Vâng, đó là loại vấn đề tôi đang cố gắng bẫy. Tôi hy vọng một người nào đó có một giải pháp mà sẽ không tạo ra ID trống. Nó sẽ không phải là kết thúc của thế giới nếu tôi đã kết thúc với một ID trống mỗi khi tôi chạy kịch bản, nhưng lý tưởng tôi muốn tránh điều đó. –

0

Nếu cột ID được đặt thành GENERATED BY ALWAYS, bạn sẽ không gặp sự cố với tải/nhập không đúng cách. Ngoài ra, chức năng IDENTITY_VAL_LOCAL có thể được sử dụng để nhận giá trị nhận dạng.
Thông tin thêm về chức năng này here