2013-08-15 57 views
5

Tôi đang tạo bảng nơi tôi sẽ thêm tên tệp và nhiều trường khác. Tôi đã sử dụng một cột fileid để đại diện cho các tập tin theo thứ tự tuần tự; tức là tệp đầu tiên được tải lên phải có fieldid 1, thì tệp tiếp theo sẽ có tệp 2 và cứ tiếp tục như vậy. Tôi sử dụng một chuỗi và kích hoạt:Sử dụng trình tự trong khi thêm và xóa khỏi bảng

create sequence create_file_id start with 1 increment by 1 nocache; 

Trigger là:

before insert on add_files_details 
for each row 
begin 
select create_file_id.nextval into :new.file_id from dual; 
end; 

Nhưng, nếu bất cứ hồ sơ/hồ sơ được/bị xóa khỏi bảng, sau đó trình tự được lộn xộn. Vì vậy, tôi đang nghĩ đến việc sử dụng một trình tự khác với trình kích hoạt để giảm giá trị của chuỗi trước đó bằng số hàng đã bị xóa. Nhưng tôi bị mắc kẹt trong việc thực hiện kích hoạt của chuỗi này.

trình tự:

create sequence del_file_id increment by -1 nocache; 

Bất kỳ cách nào để đạt được điều này?

+0

Có thể có một số cách để làm điều này, nhưng tốt nhất là một cách phức tạp để thực hiện điều gì đó có giá trị nghi ngờ và tồi tệ nhất lỗi, chậm và không đáng tin cậy. Đã ở đó, làm điều đó, hối hận.Tôi đề nghị bạn xem xét lại. –

Trả lời

5

Bạn có thể để tự làm chính chủ chốt việc và tạo một cái nhìn của bảng cơ sở của bạn, chọn

rownum như cột mà bạn muốn xem các số từ 1 đến N theo thứ tự tuần tự:

SQL> create table your_table(
    2 tab_id number primary key, 
    3 col number 
    4 ) 
    5 ; 

Table created 

SQL> create sequence gen_id; 

Sequence created 

SQL> create trigger TR_PK_your_table 
    2 before insert on your_table 
    3 for each row 
    4 begin 
    5 :new.tab_id := gen_id.nextval; -- This kind of assignment is allowed in 11g 
    6 end;        -- and higher, in version prior to 11g 
    7/        -- conventional select statement is used 

Trigger created 

SQL> insert into your_table(col) 
    2 select level 
    3 from dual 
    4 connect by level <=7; 

7 rows inserted 

SQL> commit; 

Commit complete 

SQL> select * 
    2 from your_table; 

    TAB_ID  COL 
---------- ---------- 
     1   1 
     2   2 
     3   3 
     4   4 
     5   5 
     6   6 
     7   7 

7 rows selected 

SQL> create or replace view V_your_table 
    2 as 
    3 select tab_id 
    4  , col 
    5  , rownum as num 
    6 from your_table 
    7 ; 

View created 

SQL> select * 
    2 from v_your_table; 

    TAB_ID  COL  NUM 
---------- ---------- ---------- 
     1   1   1 
     2   2   2 
     3   3   3 
     4   4   4 
     5   5   5 
     6   6   6 
     7   7   7 

7 rows selected 

SQL> delete from your_table where tab_id in (3,5,6); 

3 rows deleted 

SQL> commit; 

Commit complete 

SQL> select * 
    2 from your_table; 

    TAB_ID  COL 
---------- ---------- 
     1   1 
     2   2 
     4   4 
     7   7 

SQL> select * 
    2 from v_your_table; 

    TAB_ID  COL  NUM 
---------- ---------- ---------- 
     1   1   1 
     2   2   2 
     4   4   3 
     7   7   4 

SQL> 
+0

Đó là một giải pháp thực sự phức tạp nhưng đơn giản. Cảm ơn bạn đã chỉ ra giải pháp này – DeSmOnd

5

Đọc AskTom về lý do bạn không muốn thử và tạo chuỗi không có khoảng cách.

@Nicholas có cách tiếp cận khá tốt ở đó, chưa bao giờ nghĩ đến điều đó trước đây.

Tuy nhiên, một vài vấn đề.

  1. Nếu sử dụng chế độ xem trong chế độ xem của bạn, bạn cũng sẽ phải bao gồm câu lệnh ORDER BY trên TAB_ID.
  2. Sử dụng TAB_ID từ ví dụ; trong một hệ thống RAC, không có đảm bảo rằng bạn sẽ nhận được số sẵn có tiếp theo, vì vậy ORDER BY có thể không giúp bạn.

Mở rộng một chút về cách tiếp cận, có thể thêm cột DATE hoặc TIMESTAMP trên bàn và sau đó sử dụng trong ORDER BY. Tôi chưa thử nghiệm phương pháp đó.

Quay lại điểm của AskTom, có lý do cụ thể nào khiến bạn muốn một chuỗi không có khoảng cách không?

gì xảy ra khi một vụ nổ đường ống nước trong phòng qua phòng các hộp trong và 50 của hộp được hoàn toàn và hoàn toàn bị hư hỏng ngoài sử dụng.

hoặc ai đó nghiền hộp một cách tình cờ.

hoặc - bất cứ điều gì

nó không phải là khoảng trống nói chung. Và nó không phải là hệ thống được chỉ định, khoảng cách chuỗi tự do ...

+1

Chúng tôi đang phát triển một trang web chia sẻ tài liệu, giao diện người dùng là Java và chương trình phụ trợ là oracle pl/sql. Vì vậy, khi chúng tôi muốn thêm tệp, id sẽ được tạo tuần tự. Nhưng nếu tập tin bị xóa khỏi bảng này, toàn bộ hàng phải được loại bỏ khỏi bảng này và phải được chèn vào một bảng khác, được đặt tên chi tiết các tập tin đã xóa. Vào cuối ngày, chúng tôi phải tạo báo cáo hoàn chỉnh về các tệp đã thêm và đã xóa. Đó là lý do tại sao, chúng ta cần một chuỗi. Ngoài ra, chúng tôi đang nghĩ đến việc tham chiếu và sắp xếp tệp id theo loại tệp thay vì tên tệp dài, điều này sẽ tăng tốc quá trình tìm kiếm – DeSmOnd

+1

Tôi nhận được việc sử dụng trình tự, cách hoàn toàn có thể chấp nhận để sử dụng nó. Vấn đề, như tôi thấy, đang cố gắng duy trì một số loại chuỗi không có khoảng cách. Điều đó không cần thiết. Hãy cẩn thận với cách tiếp cận câu trả lời được chấp nhận vì những lý do tôi đã nói ở trên. Chúc may mắn. – oraclenerd