Живея и работя близо до съоръжение на Microsoft. Като такива, много от настоящите ни служители са бивши служители на Microsoft, които идват от SQL Server. SQL Server ви позволява да създадете таблица с колона IDENTITY. Oracle 12c вече ви позволява да направите същото. Това трябва да помогне на тези, които правят прехода от SQL Server към Oracle. Освен това позволява на компанията по-лесно да пренася приложение от SQL Server или всяка друга база данни, която позволява колоната IDENTITY, към Oracle.
Първо ще създам таблица с колоната IDENTITY и ще я попълня с няколко реда данни.
SQL> създайте таблица test_tab (2 id НОМЕР, ГЕНЕРИРАН ПО ПОДРАЗБИРАНЕ ПРИ NULL КАТО ИДЕНТИФИКАЦИЯ, 3 val VARCHAR2(20)); Table created.SQL> вмъкнете в test_tab (val) стойности („моят първи ред“); 1 ред created.SQL> вмъкнете в test_tab (val) стойности ('моят втори ред');1 ред създаден.SQL> commit;Commit complete.
Забележете, че не вмъкнах никакви стойности в колоната ID. Сега нека да запитаме таблицата.
SQL> изберете * от test_tab;ID VAL---------- --------------------1 моя първи ред2 моя втори редпредварително>Както можете да видите, моите идентификационни стойности са добавени, както може да очаквате. При създаването на таблицата дефинирах тази колона IDENTITY със: ГЕНЕРИРАНО ПО ПОДРАЗБИРАНЕ НА NULL
Клаузата BY DEFAULT означава, че Oracle автоматично ще присвои следващата стойност в последователността, ако я пропуснете във вашия оператор INSERT. Ако го включите, Oracle ще използва посочената от вас стойност. Помислете за това:
SQL> вмъкване в стойности на test_tab (4,'specified ID=4');1 ред създаден.SQL> commit;Commit complete.SQL> изберете * от test_tab; ID VAL---------- -------------------- 1 моят първи ред 2 вторият ми ред 4 посочен ID=4Както можете да видите, защото изрично посочих ID=4 и Oracle остави тази стойност да премине. Какво се случва, когато се опитам да вмъкна следващата стойност, която трябва да е 3?
SQL> вмъкване в test_tab (val) стойности ('моят ред след ID=4');1 ред създаден.SQL> commit;Commit complete.SQL> изберете * от test_tab; ID VAL---------- -------------------- 1 моят първи ред 2 моя втори ред 4 указан ID=4 3 моят ред след ID =4Горното работи както очаквах. Използвана е следващата налична стойност на идентификатора. Но дали следващото вмъкване ще използва '4' или '5'?SQL> вмъкнете в test_tab (val) стойности ('my peth row');1 ред създаден.SQL> commit;Commit complete.SQL> изберете * от тест_раздел; ID VAL---------- -------------------- 1 моят първи ред 2 моя втори ред 4 указан ID=4 3 моят ред след ID =4 4 моят пети редОооооо! Дублираната стойност беше разрешена. Бих очаквал да бъде създадено ограничение за първичен ключ, за да наложи концепцията за стойност „идентичност“, но това не се случва. Какви ограничения съществуват?SQL> изберете име_на_ограничение,тип_на_таблица,условие за търсене от потребителски_ограничения;CONSTRAINT_NAME C TABLE_NAME-------------------------- --- - --------------------------------------- ТЪРСЕНЕ_УСЛОВИЯ--------------- -------------------------------------------------- ---------------SYS_C004978 C TEST_TAB"ID" НЕ Е NULLТака че единственото ограничение е ограничение за проверка NOT NULL. Сега нека премахнем последния ред и добавим PK ограничение.SQL> изтрийте от test_tab, където val='моят пети ред';1 ред изтрит.SQL> commit;Commit complete.SQL> alter table test_tab добавете ограничение test_tab_pk първичен ключ (id);Таблицата е променена.Сега ще се уверя, че имам данни, с които да тествам.SQL> вмъкване в стойности на test_tab (val) ('след ограничение pk'); 1 ред създаден.SQL> вмъкване в стойности на test_tab (id,val) ( 6,'изрично зададен id=6');1 създаден ред.SQL> commit;Commit complete.SQL> select * от test_tab; ID VAL---------- -------------------- 1 моят първи ред 2 моя втори ред 4 указан ID=4 3 моят ред след ID =4 5 след pk ограничение 6 изрично зададени id=66 избрани реда.Така че изрично добавих ID=6. Ако това е като когато изрично добавих ID=4, следващото ми вмъкване ще се опита да използва ID=6 и с PK ограничението ще бъде изведено изключение.SQL> вмъкнете в стойности на test_tab (val) (' след ID=6');вмъкнете в test_tab (val) стойности ('след ID=6')*ГРЕШКА в ред 1:ORA-00001:уникално ограничение (PEASLAND.TEST_TAB_PK) нарушеноТака че моралът на историята е, че ако използвате ON DEFAULT, бъдете готови да се справите с колизиите на стойностите на идентичността. По подразбиране е ВИНАГИ вместо ПО ПОДРАЗБИРАНЕ. С ВИНАГИ Oracle винаги ще използва генератора на последователни номера. Ако се опитате да посочите стойност на идентификатор, ще възникне изключение.SQL> създайте таблица test_tab2 (идентификатор, генериран винаги като идентичност, val varchar2(20)); Table created.SQL> вмъкнете в test_tab2(id,val) стойности (1,'първи ред');вмъкнете в test_tab2(id,val) стойности (1,'първи ред') *ГРЕШКА в ред 1:ORA-32795:не може да се вмъкне в генерирана винаги колона за идентичностИзгледът *_TAB_COLUMNS може да ви покаже кои колони в таблицата са IDENTITY колони.SQL> изберете column_name,identity_column от user_tab_columns, където table_name='TEST_TAB';COLUMN_NAME IDE-------------- ---ID YESVAL НЕАко използвате колоната IDENTITY във вашите таблици, внимавайте да тествате, за да сте сигурни, че разбирате, че тя работи правилно за вашето приложение. Бях изненадан, че ограничение PK или UNIQUE не беше включено автоматично, което ми позволи да добавя дублирана стойност.