Wygląda na to, że w Oracle nie ma koncepcji AUTO_INCREMENT, aż do wersji 11g włącznie.
Jak mogę utworzyć kolumnę, która zachowuje się jak automatyczny przyrost w Oracle 11g?
sql
oracle
auto-increment
Sushan Ghimire
źródło
źródło
BEFORE INSERT
wyzwalacz na stole i wyciągnąć wartości z sekwencji, aby utworzyć automatyczny przyrostOdpowiedzi:
W Oracle 11g nie ma czegoś takiego jak kolumny „auto_increment” lub „tożsamość” . Można go jednak łatwo modelować za pomocą sekwencji i wyzwalacza:
Definicja tabeli:
Definicja wyzwalania:
AKTUALIZACJA:
IDENTITY
kolumna jest teraz dostępna w Oracle 12c:lub określ wartości początkowe i przyrostowe, zapobiegając również wstawianiu do kolumny tożsamości (
GENERATED ALWAYS
) (ponownie, tylko Oracle 12c +)Alternatywnie Oracle 12 pozwala również na użycie sekwencji jako wartości domyślnej:
źródło
dept_seq
pochodzi!SELECT .. INTO
wyzwalacza, który możesz po prostu zrobić:new.id := dept_seq.NEXTVAL;
.SYS_GUID
zwraca GUID - globalnie unikalny identyfikator. ASYS_GUID
jest aRAW(16)
. Nie generuje rosnącej wartości liczbowej.Jeśli chcesz utworzyć rosnący klucz numeryczny, musisz utworzyć sekwencję.
Następnie użyjesz tej sekwencji w swoim
INSERT
wyciąguLub możesz zdefiniować wyzwalacz, który automatycznie zapełni wartość klucza podstawowego za pomocą sekwencji
Jeśli używasz Oracle 11.1 lub nowszego, możesz nieco uprościć wyzwalacz
Jeśli naprawdę chcesz użyć
SYS_GUID
źródło
CACHE 100; in CREATE SEQUENCE name_of_sequence START WITH 1 INCREMENT BY 1 CACHE 100;
zrobić?SYS_GUID()
toRAW(16)
nie 32.SYS_GUID
Dokumentacja deklarujeraw(32)
który mylić mnie.W Oracle 12c i później możesz zrobić coś takiego,
I w Oracle (sprzed 12c).
źródło
IDENTITY
w tej odpowiedzi przykład jest znacznie jaśniejszy.WHEN (new.MAP_ID IS NULL)
ma w zaakceptowanej odpowiedzi. Pozytywne.WHEN ( new.MAP_ID is null)
nie jest dobrym kodem w tym przypadku i jest już wyjaśnione w komentarzu przez @ABCade pod przyjętą odpowiedzią .. przeczytaj;)CREATE OR REPLACE TRIGGER
doEND;
, pojawia się okno „Enter Binds”. Jeśli kliknę „Zastosuj” i nie zrobię nic więcej w tym oknie, a następnie uruchomięALTER TRIGGER
polecenie, wszystko będzie dobrze, ale szkoda, że nie ma sposobu, aby programowo pozbyć się tego wyskakującego okienka i uruchomić wszystko razem. Jeśli spróbujesz tego w ogóle, dostanieszPLS-00103: Encountered the symbol 'ALTER'
i to też nie spodobaEXECUTE IMMEDIATE
(ten sam błąd, po prostu mówi toEncountered the symbol 'EXECUTE'
zamiast tego).[42000][907] ORA-00907: missing right parenthesis
gdy uruchomiłem wersję dla Oracle 12c i nowszych. Dowolny pomysł ?Oto trzy smaki:
RAW
typ danych.x
jest kolumna tożsamości. ZastąpFOO
swoją nazwą tabeli w każdym z przykładów.aktualizacja:
Oracle 12c wprowadza następujące dwa warianty, które nie zależą od wyzwalaczy:
Pierwszy wykorzystuje sekwencję w tradycyjny sposób; drugi zarządza wartością wewnętrznie.
źródło
Zakładając, że masz na myśli kolumnę taką jak kolumna tożsamości SQL Server?
W Oracle używa się SEKWENCJI, aby osiągnąć tę samą funkcjonalność. Zobaczę, czy mogę znaleźć dobry link i opublikować go tutaj.
Aktualizacja: wygląda na to, że sam ją znalazłeś. Oto i tak link: http://www.techonthenet.com/oracle/sequences.php
źródło
Baza danych Oracle 12c wprowadziła Tożsamość, kolumnę automatycznie przyrostową (wygenerowaną przez system). W poprzednich wersjach bazy danych (do 11 g) zazwyczaj implementujesz tożsamość, tworząc sekwencję i wyzwalacz. Od 12c możesz tworzyć własną tabelę i definiować kolumnę, która ma być generowana jako tożsamość.
Poniższy artykuł wyjaśnia, jak z niego korzystać:
Kolumny tożsamości - nowy wpis w bazie danych Oracle 12c
źródło
Trigger
iSequence
można go użyć, gdy chcesz uzyskać numer seryjny, który każdy może łatwo odczytać / zapamiętać / zrozumieć. Ale jeśli nie chcesz w ten sposób zarządzać kolumną identyfikatora (np. Emp_id), a wartość tej kolumny nie jest znacząca, możesz skorzystaćSYS_GUID()
z opcji Tworzenie tabeli, aby uzyskać automatyczny przyrost w ten sposób.Teraz
emp_id
kolumna zaakceptuje „globalnie unikatową wartość identyfikatora”. możesz wstawić wartość do tabeli, ignorując kolumnę emp_id w ten sposób.W ten sposób wstawi unikalną wartość do
emp_id
kolumny.źródło
SYS_GUID()
jego wartości id również również?Począwszy od Oracle 12c istnieje obsługa kolumn tożsamości na jeden z dwóch sposobów:
Sequence + Table - W tym rozwiązaniu nadal tworzysz sekwencję w normalny sposób, a następnie używasz następującego DDL:
UTWÓRZ TABELĘ MyTable (NUMER ID DOMYŚLNY MyTable_Seq.NEXTVAL , ...)
Tylko stół - w tym rozwiązaniu nie określono wyraźnie sekwencji. Użyłbyś następującego DDL:
UTWÓRZ TABELĘ MyTable (NUMER ID GENEROWANY JAKO TOŻSAMOŚĆ , ...)
Jeśli użyjesz pierwszego sposobu, jest on wstecznie zgodny z istniejącym sposobem robienia rzeczy. Drugi jest nieco prostszy i bardziej zgodny z pozostałymi systemami RDMS.
źródło
nazywa się
Identity Columns
i jest dostępny tylko w Oracle 12cprzykład wstawić
Identity Columns
jak poniżejNIE możesz zrobić wstawki jak poniżej
przydatny link
źródło
Oto kompletne rozwiązanie z obsługą wyjątków / błędów dla automatycznego zwiększania, to rozwiązanie jest wstecznie kompatybilne i będzie działać na 11g i 12c, szczególnie jeśli aplikacja jest w produkcji.
Zastąp „TABLE_NAME” odpowiednią nazwą tabeli
źródło
Oto jak to zrobiłem na istniejącej tabeli i kolumnie (o nazwie id):
źródło
źródło
źródło
wyrocznia ma sekwencje ORAZ kolumny identyfikacyjne w 12c
http://www.oracle-base.com/articles/12c/identity-columns-in-oracle-12cr1.php#identity-columns
Znalazłem to, ale nie jestem pewien, co to jest rdb 7 http://www.oracle.com/technetwork/products/rdb/0307-identity-columns-128126.pdf
źródło
tylko muszę tylko zmienić nazwę tabeli (AUDITLOGS) z nazwą twojej tabeli i new.id z nową.nazwa_kolumny
źródło
Może po prostu wypróbuj ten prosty skrypt:
http://www.hlavaj.sk/ai.php
Wynik to:
źródło
select
nowoczesnych wersji Oracle. Możesz po prostu użyć:new.pk := TABLE_PK_SEQ.NEXTVAL