Operacje na kluczu głównym przy użyciu sekwencji i wyzwalaczy

0

Witam.
Jak najprościej sobie poradzić z inkrementacją przy wstawianiu i prawidłową dekremenracją przy usuwaniu krotek w Oracle 11g ?
Próbowałem z triggerami i sekwencjami, ale zaczyna mnie to doprowadzać do szewskiej pasji bo co chwilę coś nie działa.

Np przy insercie próbowałem tak :

CREATE TABLE "Encja"(
  "ID" Integer NOT NULL, 
  "Nazwa" Varchar2(50 ) NOT NULL
)

ALTER TABLE "Encja" ADD CONSTRAINT "ID" PRIMARY KEY ("ID")

Chcę teraz zrobić autoinkrementację ID.

create sequence idEncji
start with 1
increment by 1;
 
create or replace trigger Encja_trigger
before insert on "Encja"
for each row
  begin
   :new."ID" := idEncji.nextval;
  end;

Wykonuję, pojawia się tabelka Enter Binds, klikam OK ( z zaznaczonym NULL). Następnie chcę wstawić jakąś wartość :

insert into "Encja"("Nazwa") values ('Nazwa_1');

Wstawiam kilka takich wartości, pisze że jest ok, po czym wywołuję selecta dla tej encji i wywala że Napotkano Symbol "INSERT". I od tej pory nie mogę już nawet dostawić nowych krotek bo tak samo błąd.

4
  1. Pola ID NIGDY się nie powinno dekrementować. Pole ID ma cały czas rosnąć, a po usuniętych rekordach mają zostać "dziury"
    2 . Błąd, który się pojawia nie ma nic wspólnego z trigerem czy autoinkrementacją. W oknie SQLa zostaw samego selecta to Ci się nie będzie pojawiał.
0

No ale mogę mieć kilka tabel, więc skąd wiadomo o którą mi chodzi ?

0

co??? Jak to o którą Ci chodzi?

0

No u mnie wygląda to po prostu tak :

0

A czemu to robisz za pomocą triggera, zamiast DEFAULTa?

0

na moje oko to brakuje średników za CREATE i ALTER, poza tym niepotrzebne te cudzysłowy w nazwach - wystarczy CREATE TABLE Encja , dla nazw kolumn analogicznie.

edit;
w załączniku są te średniki, w kodzie, który podałeś nie ma, spróbuj wykonać operacje oddzielnie ze średnikami

0

Każde polecenie powinno się kończyć średnikiem.
Dodatkowo po poleceniu założenia triggera musi być slash.

czyli taki skrypt powinien działać - nie był testowany:

CREATE TABLE Encja(
  ID INTEGER NOT NULL, 
  Nazwa Varchar2(50 ) NOT NULL
);
 
ALTER TABLE Encja ADD CONSTRAINT Encja_pk PRIMARY KEY (ID);

CREATE SEQUENCE idEncji
START WITH 1
INCREMENT BY 1;

CREATE OR REPLACE TRIGGER Encja_trigger
BEFORE INSERT ON Encja
FOR each ROW
   BEGIN
    :NEW.ID := idEncji.NEXTVAL;
   END;
/

INSERT INTO Encja(Nazwa) VALUES ('Nazwa_1');
INSERT INTO Encja(Nazwa) VALUES ('Nazwa_2');
INSERT INTO Encja(Nazwa) VALUES ('Nazwa_3');
INSERT INTO Encja(Nazwa) VALUES ('Nazwa_4');
COMMIT;

SELECT * FROM ENCJA;

1 użytkowników online, w tym zalogowanych: 0, gości: 1