2017-06-12 3 views
0

J'utilise Oracle SQL. Il y a une séquence et un déclencheur utilisés pour l'identifiant qui s'incrémente de 1 chaque fois qu'un nouvel enregistrement est ajouté dans la table. Cependant, si tous les enregistrements sont supprimés et que de nouveaux enregistrements sont ajoutés à cette table, l'identifiant ne commence pas à partir de 1 alors qu'il commence à partir du dernier nombre maximum d'enregistrements enregistrés dans la séquence.Comment réinitialiser la séquence si la table est vide?

Il y a donc un moyen dans l'instruction TRIGGER dans lequel je peux réinitialiser la séquence si la table est vide et que de nouveaux enregistrements sont importés.

OU dois-je procéder de manière stockée_procédure, si c'est alors comment puis-je appeler cela en utilisant myBatis mapper?

Table (customer_info)

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

Séquence

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

Trigger

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; 
/

Merci.

+0

Qu'y a-t-il de mal à ne pas utiliser un champ d'auto-incrémentation dans ce cas le customer_id_seq? reset back devrait être juste TRUNCATE table maSTAShuFu

+0

@maSTAShuFu C'est Oracle pas le serveur SQL et pas une colonne d'identité. –

+0

Avoir du sens ... ne m'attendais pas à ce que – maSTAShuFu

Répondre

2

Une fois que vous avez tronqué la table. La séquence doit être réinitialisée à 1.

La manière la plus simple de le faire en le laissant tomber et en le recréant.

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

Le plus simple? Probablement. Meilleure option? Non. Une meilleure option consisterait à modifier la séquence, changer la valeur 'increment by' en - << valeur-courante >>, générer la valeur suivante et changer la valeur' increment by' en 1. Si on vous accorde 'select' Privilège sur cette séquence à un autre utilisateur, ils devraient être re-accordé à nouveau une fois que vous laissez tomber et recréer la séquence. –

+0

@Mikolas Pansky, Si j'implémente de cette façon, alors il ne sera pas robuste, il consomme du temps à DROP et CREATE. Par conséquent, je cherchais à le rendre automatique. –

+0

Bien sûr, l'INCREMENT utilisant une valeur négative est la solution la plus élégante. Et même sans utiliser le DDL. –