2015-08-03 13 views
5

Tôi đang sử dụng tính năng IDENTITY của oracle 12 c để tăng id bản ghi của bảng.
Là một phần của thiết lập ban đầu, chúng tôi phải di chuyển một số bản ghi từ một hệ thống khác sang bảng này. các bản ghi này là các bản ghi không tuần tự (các bản ghi từng phần bị xóa).Cách đặt lại cột IDENTITY trong oracle thành một giá trị mới

Cách làm cho danh tính luôn tạo ra cao nhất value + 1 dựa trên các bản ghi bảng.

Sau khi googling cho các tùy chọn khác nhau được tìm thấy từ khóa của RESTART WITH tùy chọn giá trị. Đối với điều này, chúng ta cần phải tạo một thủ tục lưu trữ mới và thay đổi tất cả các bảng có giá trị cao nhất có thể để khởi động lại.

Có từ khóa trực tiếp nào có thể được sử dụng cùng với IDENTITY có thể buộc từ khóa đó luôn tạo lại giá trị cao hơn hay không. ?

+0

RESTART VỚI chức năng không hoạt động mặc dù điều này được khuyến nghị như là tùy chọn trong tài liệu oracle. Chỉ có tùy chọn dường như thay đổi bảng và buộc IDENTITY bắt đầu từ giá trị cao nhất + 1. – sims

+0

"khởi động lại bằng" không phải là oracle, có thể mysql? – Scott

Trả lời

1

Không có từ khóa trực tiếp nào và bạn phải thay đổi bảng (các từ đúng là BẮT ĐẦU VỚI).
Có một cách khác để thay đổi cột nước cao cho cột nhận dạng. Đối với các chuỗi phổ biến (theo cách nhận dạng được xây dựng trên một chuỗi hệ thống), hãy sử dụng một mẹo cũ với INCREMENT BY cho việc dịch chuyển dấu theo bất kỳ hướng nào.

ALTER TABLE T 
MODIFY (ID NUMBER GENERATED ALWAYS AS IDENTITY 
INCREMENT BY 50 
NOCACHE); 

Nghĩa là, nếu bây giờ giá trị tiếp theo là 100 và bạn cần phải làm cho nó 1000, bạn làm thủ thuật này hai lần: "tăng 900", thêm kỷ lục và trở lại "tăng 1" (nếu bản sắc với bước 1).

3

này đã trở thành siêu dễ dàng trong 12c

alter table your_table modify (id generated by default on null as identity 
           start with limit value); 

Sau đó chèn tiếp theo một cách an toàn sẽ chèn sử dụng một chuỗi đã được tự động thiết lập lại những gì là cơ bản max (id) +1 https://docs.oracle.com/database/121/SQLRF/statements_3001.htm#SQLRF01001

+0

Tôi luôn nhận được _ORA-30673: cột cần được sửa đổi không phải là cột nhận dạng_ khi cố gắng tạo cột cho cột nhận dạng. Có vẻ như bạn chỉ có thể tinh chỉnh cài đặt của cột nhận dạng hiện tại, không chuyển đổi cột không nhận dạng hiện tại thành cột. –

+0

Chính xác. Câu lệnh này được sử dụng để đặt lại giá trị chuỗi, không di chuyển hành vi của cột. Xem ví dụ này để biết ví dụ http://www.grassroots-oracle.com/2016/10/decommissioning-triggers-in-12c.html – Scott

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