Oracle
 sql >> Baza danych >  >> RDS >> Oracle

Jak zdefiniować klucz podstawowy automatycznego przyrostu w Oracle?

Ku frustracji administratorów baz danych na całym świecie, przed wersją Oracle 12c w połowie 2014 r. firma Oracle po prostu nie miała wrodzonej zdolności do generowania automatycznie zwiększających się kolumn w schemacie tabeli. Chociaż przyczyny tej decyzji projektowej można tylko zgadywać, dobrą wiadomością jest to, że nawet dla użytkowników starszych systemów Oracle istnieje możliwe obejście tej pułapki i utworzenie własnej kolumny klucza podstawowego z automatycznym przyrostem.

Tworzenie sekwencji

Pierwszym krokiem jest utworzenie SEQUENCE w bazie danych, która jest obiektem danych, do którego wielu użytkowników może uzyskać dostęp, aby automatycznie generować zwiększone wartości. Jak omówiono w dokumentacji, sekwencja w Oracle zapobiega jednoczesnemu tworzeniu zduplikowanych wartości, ponieważ wielu użytkowników jest skutecznie zmuszanych do „na zmianę” przed wygenerowaniem każdego kolejnego elementu.

Aby utworzyć unikalny klucz podstawowy dla nowej tabeli, najpierw musimy CREATE tabela, której będziemy używać:

CREATE TABLE books (
  id      NUMBER(10)    NOT NULL,
  title   VARCHAR2(100) NOT NULL
);

Następnie musimy dodać PRIMARY KEY ograniczenie:

ALTER TABLE books
  ADD (
    CONSTRAINT books_pk PRIMARY KEY (id)
  );

Na koniec utworzymy naszą SEQUENCE które zostaną później wykorzystane do wygenerowania unikalnej, automatycznie zwiększanej wartości.

CREATE SEQUENCE books_sequence;

Dodawanie wyzwalacza

Chociaż mamy gotowy stół, nasza sekwencja do tej pory po prostu tam siedzi, ale nigdy nie jest używana. To tutaj TRIGGERS wejdź.

Podobne do event we współczesnych językach programowania TRIGGER w Oracle to procedura składowana, która jest wykonywana po wystąpieniu określonego zdarzenia.

Zazwyczaj TRIGGER zostanie skonfigurowany tak, aby uruchamiał się, gdy tabela zostanie zaktualizowana lub rekord zostanie usunięty, zapewniając w razie potrzeby trochę oczyszczenia.

W naszym przypadku chcemy wykonać nasz TRIGGER przed INSERT do naszych books tabeli, zapewniając naszą SEQUENCE jest zwiększany, a nowa wartość jest przekazywana do naszej kolumny klucza podstawowego.

CREATE OR REPLACE TRIGGER books_on_insert
  BEFORE INSERT ON books
  FOR EACH ROW
BEGIN
  SELECT books_sequence.nextval
  INTO :new.id
  FROM dual;
END;

Tutaj tworzymy (lub zastępujemy, jeśli istnieje) TRIGGER o nazwie books_on_insert i określenie, że chcemy, aby wyzwalacz uruchamiał BEFORE INSERT występuje dla books tabeli i ma zastosowanie do wszystkich zawartych w niej wierszy.

„Kod” samego wyzwalacza jest dość prosty:SELECT następna wartość przyrostowa z naszej poprzednio utworzonej books_sequence SEQUENCE , i wstawiając go do :new zapis books tabela w określonym .id pole.

Uwaga:kod FROM dual część jest niezbędna do zrealizowania prawidłowego zapytania, ale w rzeczywistości jest nieistotna. dual tabela jest tylko pojedynczym fikcyjnym wierszem danych i jest dodawana, w tym przypadku, tylko po to, aby można ją było zignorować i zamiast tego możemy wykonać funkcję systemową naszego wyzwalacza, zamiast zwracać jakieś dane.

Kolumny IDENTITY

IDENTITY kolumny zostały wprowadzone w Oracle 12c, co pozwala na prostą funkcję automatycznego przyrostu w nowoczesnych wersjach Oracle.

Korzystanie z IDENTITY kolumna jest funkcjonalnie podobna do innych systemów bazodanowych. Odtworzenie naszych powyższych books schemat tabeli w nowoczesnym Oracle 12c lub nowszym, po prostu użyjemy następującej definicji kolumny.

CREATE TABLE books (
  id      NUMBER        GENERATED BY DEFAULT ON NULL AS IDENTITY,
  title   VARCHAR2(100) NOT NULL
);

  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Struktura drzewa w sql w Oracle. Jak wyświetlić drzewo, węzły podrzędne i węzły nadrzędne w SQL Oracle?

  2. Nie ważny miesiąc na wyciągu INSERT

  3. Jak korzystać z wyliczeń w Oracle?

  4. Jak używać bieżącej daty w zapytaniu HQL z bazą danych Oracle?

  5. cd:-M:nieprawidłowa opcja