SAP Výukový program HANA: Vytvořte sekvenci

⚡ Chytré shrnutí

Vytvořit sekvenci v SAP HANA definuje databázový objekt, který automaticky generuje inkrementovaný seznam číselných hodnot. Parametry řídí počáteční hodnotu, inkrementaci, limity, cyklování a chování generátoru při ukládání do mezipaměti.

  • 🔢 Základní definice: Posloupnost generuje čísla podle pravidla stanoveného v její specifikaci, vzestupně nebo sestupně.
  • 🔗 Bez vazby na tabulku: Sekvence jsou nezávislé objekty používané aplikací, nikoli připojené k žádné tabulce.
  • 📍 Dvě hodnoty: Funkce CURRVAL vrací aktuální hodnotu a funkce NEXTVAL posune sekvenci vpřed a vrátí novou hodnotu.
  • 🎚️ Klíčové parametry: Funkce START WITH, INCREMENT BY, MAXVALUE, MINVALUE, CYCLE a CACHE utvářejí výstup.
  • ♻️ Cyklistika: CYCLE restartuje číslování od limitu; NO CYCLE je výchozí nastavení a místo toho vyvolá chybu.
  • caching: CACHE rezervuje blok čísel na uzel pro zvýšení rychlosti; výchozí je NO CACHE.
  • 🔄 Možnost resetování: Funkce RESET BY spustí poddotaz při restartu databáze a obnoví práci od hodnoty, kterou vrátí.

Vytvořit sekvenci v SAP HANA

Co je sekvence?

Sekvence je databázový objekt, který automaticky generuje inkrementovaný seznam číselných hodnot podle pravidla specifikovaného ve specifikaci sekvence.

Například pro automatické vložení čísla zaměstnance do sloupce (EMPLOYEE_NO) tabulky, když je do tabulky vložen nový záznam, pak použijeme sekvenci.

Sekvenční hodnoty jsou generovány ve vzestupném nebo sestupném pořadí.

Sekvence nejsou spojeny s tabulkami; jsou používány aplikací. Existují dvě hodnoty za sebou –

  • CURRVAL – Zadejte aktuální hodnotu sekvence.
  • NEXTVAL – Zadejte další hodnotu sekvence.

SYNTAX

CREATE SEQUENCE <sequence_name> [<sequence_parameter_list>] [RESET BY <subquery>]

PRVKY SYNTAXE

PRVKY POPIS
Je to název sekvence.
[ ] Určuje jeden nebo více parametrů sekvence.
ZAČÍT S Popisuje hodnotu počáteční sekvence.
PŘÍRŮST O Toto specifikuje hodnotu, která se má zvýšit od poslední přiřazené hodnoty pokaždé, když je vygenerována nová sekvenční hodnota. Výchozí hodnota je 1.
MAX Toto určuje maximální hodnotu, kterou může sekvence vygenerovat. může být mezi -4611686018427387903 a 4611686018427387902.
ŽÁDNÁ MAXIMÁLNÍ HODNOTA Pokud je zadána hodnota NO MAXVALUE, bude pro vzestupnou posloupnost maximální hodnota 4611686018427387903 a minimální hodnota pro sestupnou posloupnost bude -1.
MIN / ŽÁDNÁ MINIMÁLNÍ HODNOTA Určuje minimální hodnotu, kterou může sekvence vygenerovat. může být mezi -4611686018427387904 a 4611686018427387902. Pokud se použije NO MINVALUE, minimální hodnota pro vzestupnou posloupnost je 1.
CYKLUS Direktiva CYCLE určuje, že pořadové číslo bude restartováno po dosažení maximální nebo minimální hodnoty.
ŽÁDNÝ CYKLUS Výchozí možnost. Direktiva NO CYCLE určuje, že pořadové číslo nebude restartováno po dosažení maximální nebo minimální hodnoty.
MEZIPAMĚŤ Velikost mezipaměti určuje, který rozsah pořadových čísel bude v uzlu uložen do mezipaměti. musí být celé číslo bez znaménka.
ŽÁDNÁ CACHE Výchozí možnost. Direktiva NO CACHE určuje, že pořadové číslo nebude v uzlu ukládáno do mezipaměti.
RESET BY Určuje, že během restartu databáze databáze automaticky provede a hodnota sekvence je restartována s vrácenou hodnotou.

Příklad -

Vytvoříme sekvenci s názvem DHK_SCHEMA.EMP_NO, která vytvoří navýšenou hodnotu sekvence o +1 pokaždé, když je sekvence použita.

Sekvenční skript –

CREATE SEQUENCE DHK_SCHEMA.EMP_NO START WITH 100 INCREMENT BY 1;

Zde použijeme objekt „sekvence“ v níže uvedeném příkladu ke zvýšení hodnoty zaměstnance no o +1 pokaždé, když se provede výběrový dotaz. V dotazu lze „nextval“ použít pro generování sériového čísla nebo stejného typu požadavku.

Použití sekvence –

SELECT DHK_SCHEMA.EMP_NO.nextval FROM DUMMY;

VÝSTUP – 100, 101, 102 … a tak dále pro každé provedení výše uvedeného výběrového dotazu.

Jak používat sekvenci v tabulce

Výše uvedený příklad vrací číslo, ale nikam ho neukládá. Tři vzory propojují sekvenci se skutečnými daty a správná volba závisí na tom, kolik kontroly aplikace potřebuje.

1) Zavolejte NEXTVAL přímo v INSERT. Nejexplicitnější přístup. Aplikace rozhoduje, kdy je číslo spotřebováno.

CREATE COLUMN TABLE DHK_SCHEMA.EMPLOYEE (
  EMPLOYEE_NO INTEGER NOT NULL,
  EMP_NAME    NVARCHAR(100),
  PRIMARY KEY (EMPLOYEE_NO)
);

INSERT INTO DHK_SCHEMA.EMPLOYEE
  VALUES (DHK_SCHEMA.EMP_NO.NEXTVAL, 'Anita Sharma');

2) Použijte sekvenci jako výchozí sloupec. Číslo je přiřazeno i v případě, že vložený text neuvádí daný sloupec, což vyhovuje aplikacím, které nebyly nikdy napsány tak, aby o dané sekvenci věděly.

CREATE COLUMN TABLE DHK_SCHEMA.EMPLOYEE2 (
  EMPLOYEE_NO INTEGER DEFAULT DHK_SCHEMA.EMP_NO.NEXTVAL,
  EMP_NAME    NVARCHAR(100)
);

INSERT INTO DHK_SCHEMA.EMPLOYEE2 (EMP_NAME) VALUES ('Ravi Kumar');

3) Přečtěte si právě vydanou hodnotu. Funkce CURRVAL vrací poslední číslo, které tato relace nabyla, což je způsob, jakým je podřízený řádek propojen s právě vloženým nadřazeným řádkem.

SELECT DHK_SCHEMA.EMP_NO.CURRVAL FROM DUMMY;

Warning️ Varování: Funkce CURRVAL selže s chybou, dokud není funkce NEXTVAL v aktuální relaci volána alespoň jednou. Funkce hlásí hodnotu vydanou pro tuto relaci, nikoli globální maximum, takže dvě relace mohou ve stejném okamžiku obsahovat různé aktuální hodnoty.

Sekvence vs. sloupec identity

SAP HANA také nabízí sloupec identity, který generuje čísla bez samostatného objektu. Oba řeší stejný problém odlišně.

Parametr Sekvence Sloupec identity
Typ objektu Nezávislý databázový objekt Vlastnost sloupce jedné tabulky
Sdíleno mezi tabulkami Ano, může z něj čerpat libovolný počet tabulek. Ne, patří to do jednoho sloupce.
Hodnota viditelná před vložením Ano, prostřednictvím NEXTVAL Ne, generováno během vkládání
Definice VYTVOŘIT POŘADÍ VYGENEROVÁNO VE VÝCHOZÍM NASTAVENÍ JAKO IDENTITA
Nejlepší pro Sdílené číslování, nadřazené a podřízené vkládání Jednoduchý náhradní klíč na jednom stole

Vyberte posloupnost, pokud musí být číslo známo před existencí řádku, nebo pokud několik tabulek sdílí jednu číslovací řadu. Vyberte sloupec identity pro prostý náhradní klíč bez širších požadavků.

Správa sekvencí: ALTER, DROP a mezery

Sekvence málokdy zůstane taková, jaká byla původně vytvořena. Opakovaně se objevují tři úlohy údržby.

Změna chování. ALTER SEQUENCE upravuje přírůstek, limity nebo cyklování existující sekvence bez propadu.ping RESTART WITH vynuluje počítadlo, což je obvyklý krok po opětovném načtení testovacích dat.

ALTER SEQUENCE DHK_SCHEMA.EMP_NO RESTART WITH 1000;
ALTER SEQUENCE DHK_SCHEMA.EMP_NO INCREMENT BY 10;
DROP SEQUENCE DHK_SCHEMA.EMP_NO;

Pochopení mezer. Není zaručeno, že pořadová čísla budou souvislá, což překvapuje lidi, kteří očekávají nepřerušenou auditní stopu. Mezery se objevují ze tří důvodů:

  • Vrácené transakce. Funkce NEXTVAL není transakční. Číslo spotřebované vloženým procesem, který je později vrácen zpět, se nikdy znovu nevydá.
  • Ukládání do mezipaměti. S CACHE 100 si uzel rezervuje sto hodnot najednou. Restart zahodí vše, co v daném bloku zůstane nepoužité.
  • Souběžné sezení. Dvě relace vkládající se současně prokládají svá čísla, takže ani jedna z nich nevidí nepřetržitý běh.

Praktickým pravidlem je zacházet s posloupností jako se zdrojem jedinečných identifikátorů, nikdy ne jako s čítačem počtu existujících řádků. Pokud je nepřerušená posloupnost zákonným požadavkem, například u číslování faktur, musí být generována aplikační logikou s vlastními ovládacími prvky, nikoli databázovou posloupností.

Hledání toho, co existuje. Systémový pohled SEQUENCES uvádí každou sekvenci s její aktuální hodnotou, což je nejrychlejší způsob auditu schématu. Související syntaxe je popsána v SAP HANA SQL a definice sloupců v SAP Datové typy HANA.

Nejčastější dotazy

Vrácené transakce, bloky uložené v mezipaměti ztracené při restartu a souběžné relace vytvářejí mezery. Sekvence zaručuje jedinečnost, nikdy ne nepřetržitý sled hodnot.

Ano. Sekvence je nezávislá na jakékoli tabulce, takže z ní může čerpat několik tabulek. To je užitečné, když identifikátory musí být jedinečné v celém schématu, a ne v každé tabulce.

Ano. Analýza propustnosti vkládání ukazuje, kolik hodnot uzel spotřebuje mezi restarty, což vyvažuje zisk rychlosti ukládání do mezipaměti oproti velikosti mezer, které vytváří.

Ano. Porovnání aktuálních hodnot s MAXVALUE a mírou spotřeby předpovídá vyčerpání, takže sekvence se rozšíří dříve, než začnou vložky v produkčním prostředí selhávat.

Protože NEXTVAL nebyl v aktuální relaci volán. CURRVAL hlásí hodnotu vydanou v této relaci, takže nemá co hlásit, dokud není nějaká převzata.

Shrňte tento příspěvek takto: