sql - Oracle पर AUTO_INCREMENT के साथ आईडी कैसे बनाएं?




auto-increment (11)

इस तरह मैंने इसे मौजूदा तालिका और कॉलम (नामित आईडी) पर किया है:

UPDATE table SET id=ROWNUM;
DECLARE
  maxval NUMBER;
BEGIN
  SELECT MAX(id) INTO maxval FROM table;
  EXECUTE IMMEDIATE 'DROP SEQUENCE table_seq';
  EXECUTE IMMEDIATE 'CREATE SEQUENCE table_seq START WITH '|| TO_CHAR(TO_NUMBER(maxval)+1) ||' INCREMENT BY 1 NOMAXVALUE';
END;
CREATE TRIGGER table_trigger
  BEFORE INSERT ON table
  FOR EACH ROW
BEGIN
  :new.id := table_seq.NEXTVAL;
END;

ऐसा प्रतीत होता है कि संस्करण 11 जी तक, ओरेकल में ऑटोऑक्रिकमेंट की कोई अवधारणा नहीं है।

मैं एक कॉलम कैसे बना सकता हूं जो ओरेकल 11 जी में ऑटो वृद्धि की तरह व्यवहार करता है?


इसे Identity Columns कहा जाता है और यह केवल ओरेकल ओरेकल 12 सी से उपलब्ध है

CREATE TABLE identity_test_tab
(
   id            NUMBER GENERATED ALWAYS AS IDENTITY,
   description   VARCHAR2 (30)
);

नीचे दिए गए Identity Columns में सम्मिलित करने का उदाहरण

INSERT INTO identity_test_tab (description) VALUES ('Just DESCRIPTION');

1 पंक्ति बनाई गई।

आप नीचे की तरह सम्मिलित नहीं कर सकते हैं

INSERT INTO identity_test_tab (id, description) VALUES (NULL, 'ID=NULL and DESCRIPTION');

लाइन 1 पर त्रुटि: ओआरए -32795: जेनरेट किए गए हमेशा पहचान कॉलम में सम्मिलित नहीं हो सकता है

INSERT INTO identity_test_tab (id, description) VALUES (999, 'ID=999 and DESCRIPTION');

लाइन 1 पर त्रुटि: ओआरए -32795: जेनरेट किए गए हमेशा पहचान कॉलम में सम्मिलित नहीं हो सकता है

उपयोगी लिंक


ओरेकल 12 सी आगे में आप कुछ ऐसा कर सकते हैं,

CREATE TABLE MAPS
(
  MAP_ID INTEGER GENERATED ALWAYS AS IDENTITY (START WITH 1 INCREMENT BY 1) NOT NULL,
  MAP_NAME VARCHAR(24) NOT NULL,
  UNIQUE (MAP_ID, MAP_NAME)
);

और ओरेकल (प्री 12 सी) में।

-- create table
CREATE TABLE MAPS
(
  MAP_ID INTEGER NOT NULL ,
  MAP_NAME VARCHAR(24) NOT NULL,
  UNIQUE (MAP_ID, MAP_NAME)
);

-- create sequence
CREATE SEQUENCE MAPS_SEQ;

-- create tigger using the sequence
CREATE OR REPLACE TRIGGER MAPS_TRG 
BEFORE INSERT ON MAPS 
FOR EACH ROW
WHEN (new.MAP_ID IS NULL)
BEGIN
  SELECT MAPS_SEQ.NEXTVAL
  INTO   :new.MAP_ID
  FROM   dual;
END;
/

ओरेकल 12 सी से शुरू करने से पहचान कॉलम के लिए दो तरीकों से समर्थन होता है:

  1. अनुक्रम + तालिका - इस समाधान में आप अभी भी एक अनुक्रम बनाते हैं जैसा कि आप सामान्य रूप से करेंगे, तो आप निम्न डीडीएल का उपयोग करें:

    टेबल MyTable बनाएं (आईडी नंबर डिफॉल्ट MyTable_Seq.NEXTVAL , ...)

  2. केवल तालिका - इस समाधान में कोई अनुक्रम स्पष्ट रूप से निर्दिष्ट नहीं है। आप निम्नलिखित डीडीएल का उपयोग करेंगे:

    तालिका MyTable बनाएं (आईडी संख्या पहचान के रूप में उत्पन्न , ...)

यदि आप पहली बार उपयोग करते हैं तो यह चीजों को करने के मौजूदा तरीके से पिछड़ा संगत है। दूसरा थोड़ा और सीधा है और बाकी आरडीएमएस सिस्टम के साथ और अधिक इनलाइन है।



जब आप धारावाहिक संख्या चाहते हैं तो Trigger और Sequence का उपयोग किया जा सकता है कि कोई भी आसानी से पढ़ / याद / समझ सकता है। लेकिन यदि आप इस तरह से आईडी कॉलम (emp_id) को प्रबंधित नहीं करना चाहते हैं, और इस कॉलम का मान बहुत अधिक नहीं है, तो आप इस तरह ऑटो वृद्धि प्राप्त करने के लिए तालिका निर्माण पर SYS_GUID() उपयोग कर सकते हैं।

CREATE TABLE <table_name> 
(emp_id RAW(16) DEFAULT SYS_GUID() PRIMARY KEY,
name VARCHAR2(30));

अब आपका emp_id कॉलम "वैश्विक रूप से अद्वितीय पहचानकर्ता मान" स्वीकार करेगा। आप इस तरह emp_id कॉलम को अनदेखा करके तालिका में मूल्य डाल सकते हैं।

INSERT INTO <table_name> (name) VALUES ('name value');

तो, यह आपके emp_id कॉलम के लिए अद्वितीय मान emp_id


यहां तीन स्वाद हैं:

  1. संख्यात्मक सरल बढ़ती संख्यात्मक मूल्य, उदाहरण के लिए 1,2,3, ....
  2. GUID विश्व स्तर पर यूनिवर्सल पहचानकर्ता, एक RAW डेटाटाइप के रूप में।
  3. GUID (स्ट्रिंग) । उपरोक्त के समान, लेकिन एक स्ट्रिंग के रूप में जो कुछ भाषाओं में संभालना आसान हो सकता है।

x पहचान कॉलम है। उदाहरणों में से प्रत्येक में अपने टेबल नाम के साथ FOO का चयन करें।

-- numerical identity, e.g. 1,2,3...
create table FOO (
    x number primary key
);
create sequence  FOO_seq;

create or replace trigger FOO_trg
before insert on FOO
for each row
begin
  select FOO_seq.nextval into :new.x from dual;
end;
/

-- GUID identity, e.g. 7CFF0C304187716EE040488AA1F9749A
-- use the commented out lines if you prefer RAW over VARCHAR2.
create table FOO (
    x varchar(32) primary key        -- string version
    -- x raw(32) primary key         -- raw version
);

create or replace trigger FOO_trg
before insert on FOO
for each row
begin
  select cast(sys_guid() as varchar2(32)) into :new.x from dual;  -- string version
  -- select sys_guid() into :new.x from dual;                     -- raw version
end;
/

अद्यतन करें:

ओरेकल 12 सी इन दो प्रकारों को प्रस्तुत करता है जो ट्रिगर्स पर निर्भर नहीं हैं:

create table mytable(id number default mysequence.nextval);
create table mytable(id number generated as identity);

पहला व्यक्ति परंपरागत तरीके से अनुक्रम का उपयोग करता है; दूसरा आंतरिक रूप से मूल्य का प्रबंधन करता है।


शायद इस सरल लिपि को आजमाएं:

http://www.hlavaj.sk/ai.php

परिणाम है:

CREATE SEQUENCE TABLE_PK_SEQ; 
CREATE OR REPLACE TRIGGER TR_SEQ_TABLE BEFORE INSERT ON TABLE FOR EACH ROW 

BEGIN
SELECT TABLE_PK_SEQ.NEXTVAL
INTO :new.PK
FROM dual;
END;

ओरेकल 11 जी के रूप में ओरेकल में "auto_increment" या "पहचान" कॉलम जैसी कोई चीज़ नहीं है। हालांकि, आप अनुक्रम और ट्रिगर के साथ इसे आसानी से मॉडल कर सकते हैं:

तालिका परिभाषा:

CREATE TABLE departments (
  ID           NUMBER(10)    NOT NULL,
  DESCRIPTION  VARCHAR2(50)  NOT NULL);

ALTER TABLE departments ADD (
  CONSTRAINT dept_pk PRIMARY KEY (ID));

CREATE SEQUENCE dept_seq START WITH 1;

ट्रिगर परिभाषा:

CREATE OR REPLACE TRIGGER dept_bir 
BEFORE INSERT ON departments 
FOR EACH ROW

BEGIN
  SELECT dept_seq.NEXTVAL
  INTO   :new.id
  FROM   dual;
END;
/

अद्यतन करें:

IDENTITY कॉलम अब ओरेकल 12 सी पर उपलब्ध है:

create table t1 (
    c1 NUMBER GENERATED by default on null as IDENTITY,
    c2 VARCHAR2(10)
    );

या प्रारंभिक और वृद्धि मूल्य निर्दिष्ट करें, पहचान कॉलम में किसी भी डालने से भी GENERATED ALWAYS ( GENERATED ALWAYS ) (फिर से, ओरेकल 12 सी + केवल)

create table t1 (
    c1 NUMBER GENERATED ALWAYS as IDENTITY(START with 1 INCREMENT by 1),
    c2 VARCHAR2(10)
    );

  create trigger t1_trigger
  before insert on AUDITLOGS
  for each row
   begin
     select t1_seq.nextval into :new.id from dual;
   end;

केवल मुझे अपने टेबल नाम और new.id के साथ टेबल नाम (AUDITLOGS) को बदलना होगा। new.column_name के साथ


FUNCTION UNIQUE2(
 seq IN NUMBER
) RETURN VARCHAR2
AS
 i NUMBER := seq;
 s VARCHAR2(9);
 r NUMBER(2,0);
BEGIN
  WHILE i > 0 LOOP
    r := MOD( i, 36 );
    i := ( i - r ) / 36;
    IF ( r < 10 ) THEN
      s := TO_CHAR(r) || s;
    ELSE
      s := CHR( 55 + r ) || s;
    END IF;
  END LOOP;
  RETURN 'ID'||LPAD( s, 14, '0' );
END;




auto-increment