Oracle
 sql >> база данни >  >> RDS >> Oracle

Как да дефинирате първичен ключ за автоматично увеличение в Oracle

За голямо разочарование на администраторите на бази данни по целия свят, преди Oracle версия 12c в средата на 2014 г., Oracle просто нямаше присъща способност да генерира автоматично увеличаващи се колони в схемата на таблица. Макар че причините за това дизайнерско решение могат само да се гадаят, добрата новина е, че дори за потребители на по-стари системи на Oracle има възможно заобиколно решение за заобикаляне на този капан и създаване на своя собствена колона с първичен ключ с автоматично увеличение.

Създаване на последователност

Първата стъпка е да създадете SEQUENCE във вашата база данни, която е обект с данни, до който множество потребители имат достъп, за да генерират автоматично увеличени стойности. Както е обсъдено в документацията, последователност в Oracle предотвратява едновременното създаване на дублиращи се стойности, тъй като множество потребители са ефективно принудени да се „редуват“, преди да бъде генериран всеки последователен елемент.

За целите на създаването на уникален първичен ключ за нова таблица, първо трябва да CREATE таблицата, която ще използваме:

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

След това трябва да добавим PRIMARY KEY ограничение:

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

Накрая ще създадем нашата SEQUENCE която ще бъде използвана по-късно за действително генериране на уникалната, автоматично увеличена стойност.

CREATE SEQUENCE books_sequence;

Добавяне на тригер

Въпреки че имаме създадена и готова за работа маса, нашата последователност засега просто седи там, но никога не се използва. Това е мястото, където TRIGGERS влезте.

Подобно на event в съвременните езици за програмиране, TRIGGER в Oracle е съхранена процедура, която се изпълнява, когато настъпи определено събитие.

Обикновено TRIGGER ще бъде конфигуриран да се задейства при актуализиране на таблица или изтриване на запис, осигурявайки малко почистване, когато е необходимо.

В нашия случай искаме да изпълним нашия TRIGGER преди INSERT в нашите books таблица, осигурявайки нашата SEQUENCE се увеличава и тази нова стойност се предава на колоната ни с първичен ключ.

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;

Тук създаваме (или заменяме, ако съществува) TRIGGER с име books_on_insert и указваме, че искаме тригерът да задейства BEFORE INSERT се среща за books таблица и да бъде приложим за всеки и всички редове в нея.

„Кодът“ на самия тригер е доста прост:ние SELECT следващата инкрементална стойност от нашия по-рано създаден books_sequence SEQUENCE и го вмъкнете в :new запис на books таблица в посочения .id поле.

Забележка:FROM dual част е необходима за завършване на правилна заявка, но всъщност е ирелевантна. dual таблицата е само един фиктивен ред от данни и се добавя, в този случай, само за да може да бъде игнорирана и вместо това да можем да изпълним системната функция на нашия тригер, вместо да връщаме данни от някакъв вид.

Колони IDENTITY

IDENTITY колоните бяха въведени в Oracle 12c, което позволява проста функционалност за автоматично увеличение в съвременните версии на Oracle.

Използване на IDENTITY колоната е функционално подобна на тази на други системи за бази данни. Пресъздаване на нашите по-горе books схема на таблица в съвременен Oracle 12c или по-нова версия, просто ще използваме следната дефиниция на колона.

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. Закръгляване до 2 знака след десетичната запетая в SQL

  2. как да направя функция за връщане на тип ред от таблица в pl/sql?

  3. Може ли %NOTFOUND да върне null след извличане?

  4. Как да конвертирате времеви печат с милисекунди до дата в Oracle

  5. Генериране на произволно число във всеки ред в Oracle Query