2017-06-12 72 views
0

我正在使用Oracle SQL。每次在表中添加新記錄時,都會有一個用於id的序列和觸發器,從1開始遞增。但是,如果刪除所有記錄並添加此記錄的新記錄,則記錄不會從1開始,而是從記錄在記錄序列中的最後一個最大記錄數開始。如果表格爲空,如何重置序列?

因此,在TRIGGER語句中,如果表格爲空且導入新記錄,則可以重置序列。

或者我必須做stored_procedure的方式,如果那樣的話我怎麼能用myBatis映射器調用這個呢?

表(CUSTOMER_INFO)

customer_id customer_name customer_location 
1   Arbin   USA 
2   Tim   Canada 
3   Rachel  Australia 

序列

CREATE sequence customer_id_seq START WITH 1 INCREMENT BY 1 NOCACHE NOCYCLE; 

觸發

CREATE OR REPLACE TRIGGER customer_id 
BEFORE INSERT ON customer_info 
FOR EACH ROW 

BEGIN 
SELECT customer_id_seq.NEXTVAL 
INTO :new.customer_id 
FROM dual; 
END; 
/

謝謝。

+0

在這種情況下不使用自動增量字段的情況下會出現什麼問題customer_id_seq?重置迴應該只是TRUNCATE表 maSTAShuFu

+0

@maSTAShuFu它不是Oracle的SQL Server,而不是一個標識列。 –

+0

有道理......沒想到 – maSTAShuFu

回答

2

一旦你截斷表。序列必須重置爲1.

最簡單的方法是通過刪除並重新創建它。

DROP SEQUENCE customer_id_seq 
CREATE sequence customer_id_seq START WITH 1 INCREMENT BY 1 NOCACHE NOCYCLE; 
+1

最簡單?大概。最好的選擇?不是。更好的選擇是改變序列,將增量值增加爲 - <<當前值>>,生成下一個值,並將增量值改回1.如果有'select'選項,將該序列的權限授予另一個用戶,一旦刪除並重新創建序列,他們應該再次被重新授予權限。 –

+0

@Mikolas Pansky,如果我實現這種方式,那麼它不會健壯,它會消耗時間每次去DROP和CREATE。所以我期待自動化。 –

+0

當然,使用負值的INCREMENT是非常優雅的解決方案。甚至不使用DDL。 –