sql >> Databáze >  >> RDS >> Oracle

12c sloupce IDENTITY

Bydlím a pracuji v blízkosti zařízení společnosti Microsoft. Mnoho našich současných zaměstnanců jsou proto bývalí zaměstnanci společnosti Microsoft, kteří pocházejí z prostředí SQL Server. SQL Server umožňuje vytvořit tabulku se sloupcem IDENTITY. Oracle 12c vám nyní umožňuje udělat totéž. To by mělo pomoci těm, kteří přecházejí ze serveru SQL Server na Oracle. Umožňuje také společnosti snadněji přenést aplikaci ze serveru SQL Server nebo jakékoli jiné databáze, která umožňuje sloupec IDENTITY, do Oracle.

Nejprve vytvořím tabulku se sloupcem IDENTITY a naplním ji několika řádky dat.

SQL> vytvořte tabulku test_tab (2      id   ČÍSLO VYGENEROVÁNO VÝCHOZÍ NA NULL AS IDENTITY,  3      val  VARCHAR2(20));Table created.SQL> vložte do hodnot test_tab (val) ('můj první řádek');1 řádek created.SQL> vložit do test_tab (val) hodnoty ('můj druhý řádek');1 řádek created.SQL> commit;Commit complete.
 

Všimněte si, že jsem do sloupce ID nevložil žádné hodnoty. Nyní se zeptáme na tabulku.

SQL> vyberte * z test_tab;ID VAL---------- --------------------1 můj první řádek2 můj druhý řádek 
 

Jak můžete vidět, moje hodnoty ID byly přidány, jak byste mohli očekávat. Při vytváření tabulky jsem definoval tento sloupec IDENTITY pomocí:    GENERATED BY DEFAULT ON NULL

Klauzule BY DEFAULT znamená, že Oracle automaticky přiřadí další hodnotu v pořadí, pokud ji vynecháte v příkazu INSERT. Pokud ji zahrnete, Oracle použije vámi zadanou hodnotu. Zvažte toto:

SQL> vložit do test_tab hodnoty (4,'specifikované ID=4');1 řádek vytvořen.SQL> commit;Commit complete.SQL> vybrat * z test_tab; ID VAL---------- --------------------        1 můj první řádek         2 můj druhý řádek         4 zadané ID=4
 

Jak vidíte, protože jsem výslovně uvedl ID=4 a Oracle nechal tuto hodnotu projít. Co se stane, když se pokusím vložit další hodnotu, která by měla být 3?

SQL> vložit do test_tab (val) hodnoty ('můj řádek po ID=4');1 řádek vytvořen.SQL> commit;Commit complete.SQL> vybrat * z test_tab; ID VAL---------- --------------------        1 můj první řádek         2 můj druhý řádek         4 zadané ID=4         3 můj řádek po ID =4
Výše uvedené fungovalo tak, jak jsem očekával. Byla použita další dostupná hodnota ID. Bude ale další vložení používat '4' nebo '5'?
SQL>  vložte do test_tab (val) values ​​('můj pátý řádek');1 řádek vytvořen.SQL> commit;Commit complete.SQL> vyberte * z test_tab; ID VAL---------- --------------------        1 můj první řádek         2 můj druhý řádek         4 zadané ID=4         3 můj řádek po ID =4         4 můj pátý řádek
A jé! Duplicitní hodnota byla povolena. Očekával bych, že bude vytvořeno omezení primárního klíče k prosazení konceptu hodnoty „identity“, ale to se nestane. Jaká omezení existují?
SQL> z uživatelských_omezení vyberte omezení_název,typ_omezení,název_tabulky,podmínku hledání;CONSTRAINT_NAME                C NÁZEV_TABULE---------------------------- --- - ------------------------------SEARCH_CONDITION---------------- -------------------------------------------------- ---------------SYS_C004978                    C TEST_TAB"ID" NENÍ NULL
Takže jediným omezením je kontrolní omezení NOT NULL. Nyní odstraníme poslední řádek a přidáme omezení PK.
SQL> odstranit z test_tab kde val='můj pátý řádek';1 řádek odstraněn.SQL> commit;Commit complete.SQL> alter table test_tab přidat omezení test_tab_pk primární klíč (id);Tabulka změněna.
Nyní se ujistím, že mám nějaká data k testování.
SQL> vložte do test_tab (val) hodnoty ('po omezení pk'); 1 řádek vytvořen.SQL> vložte do test_tab (id,val) hodnoty ( 6,'explicitly set id=6');1 řádek vytvořen.SQL> commit;Commit complete.SQL> select * from test_tab; ID VAL---------- --------------------        1 můj první řádek         2 můj druhý řádek         4 zadané ID=4         3 můj řádek po ID =4         5 po omezení pk         6 explicitně nastavených id=66 vybraných řádků.
Takže jsem výslovně přidal ID=6. Pokud je to jako když jsem explicitně přidal ID=4, moje další vložení se pokusí použít ID=6 a se zavedeným omezením PK bude vyvolána výjimka.
SQL> insert into test_tab (val) values ​​(' za ID=6');vložit do test_tab (val) hodnoty ('po ID=6')*CHYBA na řádku 1:ORA-00001:porušeno jedinečné omezení (PEASLAND.TEST_TAB_PK)
Takže morální princip příběhu je, že pokud používáte ON DEFAULT, buďte připraveni zvládnout kolize hodnot identity. Výchozí hodnota je ALWAYS namísto ON DEFAULT. S ALWAYS bude Oracle vždy používat generátor pořadových čísel. Pokud se pokusíte zadat hodnotu id, dojde k výjimce.
SQL> vytvořit tabulku test_tab2(číslo ID generované vždy jako identita, val varchar2(20));Table created.SQL> vložit do test_tab2(id,val) hodnoty (1,'první řádek');vložit do test_tab2(id,val) hodnoty (1,'první řádek')                      *CHYBA na řádku 1:ORA-32795:nelze vložit do vygenerovaného sloupce vždy identity
Zobrazení *_TAB_COLUMNS vám může ukázat, které sloupce v tabulce jsou sloupce IDENTITY.
SQL> vyberte column_name,identity_column z user_tab_columns kde table_name='TEST_TAB';COLUMN_NAME     IDE-------------- - ---ID              YESVAL             NE
Pokud ve svých tabulkách používáte sloupec IDENTITA, buďte opatrní při testování, abyste se ujistili, že správně funguje pro vaši aplikaci. Překvapilo mě, že omezení PK nebo UNIQUE nebylo automaticky zahrnuto, což mi umožnilo přidat duplicitní hodnotu.
  1. LongOpsWatcher v SQL Dev

  2. Jak nainstalovat Postgis do kegové instalace [email protected] pomocí Homebrew?

  3. Výkonnostní překvapení a předpoklady:Libovolné TOP 1

  4. MariaDB KROMĚ Vysvětlení operátora