ऐसा प्रतीत होता है कि Oracle में AUTO_INCREMENT की कोई अवधारणा नहीं है, जब तक कि संस्करण 11g तक और इसमें शामिल नहीं है।
मैं एक स्तंभ कैसे बना सकता हूं जो ओरेकल 11 जी में ऑटो वेतन वृद्धि की तरह व्यवहार करता है?
ऐसा प्रतीत होता है कि Oracle में AUTO_INCREMENT की कोई अवधारणा नहीं है, जब तक कि संस्करण 11g तक और इसमें शामिल नहीं है।
मैं एक स्तंभ कैसे बना सकता हूं जो ओरेकल 11 जी में ऑटो वेतन वृद्धि की तरह व्यवहार करता है?
जवाबों:
Oracle में "auto_increment" या "पहचान" कॉलम जैसी कोई चीज Oracle 11g के रूप में नहीं है । हालाँकि, आप इसे अनुक्रम और ट्रिगर के साथ आसानी से मॉडल कर सकते हैं:
तालिका परिभाषा:
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
स्तंभ अब Oracle 12c पर उपलब्ध है:
create table t1 (
c1 NUMBER GENERATED by default on null as IDENTITY,
c2 VARCHAR2(10)
);
या प्रारंभ और वेतन वृद्धि निर्दिष्ट करें, पहचान स्तंभ में किसी भी प्रविष्टि को रोकने ( GENERATED ALWAYS
) (फिर से, ओरेकल 12c + केवल)
create table t1 (
c1 NUMBER GENERATED ALWAYS as IDENTITY(START with 1 INCREMENT by 1),
c2 VARCHAR2(10)
);
वैकल्पिक रूप से, Oracle 12 भी डिफ़ॉल्ट मान के रूप में अनुक्रम का उपयोग करने की अनुमति देता है:
CREATE SEQUENCE dept_seq START WITH 1;
CREATE TABLE departments (
ID NUMBER(10) DEFAULT dept_seq.nextval NOT NULL,
DESCRIPTION VARCHAR2(50) NOT NULL);
ALTER TABLE departments ADD (
CONSTRAINT dept_pk PRIMARY KEY (ID));
dept_seq
आया है!
SELECT .. INTO
ट्रिगर में उपयोग करने की आवश्यकता नहीं है जो आप बस कर सकते हैं :new.id := dept_seq.NEXTVAL;
।
SYS_GUID
एक GUID-- एक विश्व स्तर पर अद्वितीय आईडी देता है। A एक SYS_GUID
है RAW(16)
। यह एक वृद्धिशील संख्यात्मक मान उत्पन्न नहीं करता है।
यदि आप एक वृद्धिशील संख्यात्मक कुंजी बनाना चाहते हैं, तो आप एक अनुक्रम बनाना चाहेंगे।
CREATE SEQUENCE name_of_sequence
START WITH 1
INCREMENT BY 1
CACHE 100;
फिर आप अपने INSERT
कथन में उस क्रम का उपयोग करेंगे
INSERT INTO name_of_table( primary_key_column, <<other columns>> )
VALUES( name_of_sequence.nextval, <<other values>> );
या आप एक ट्रिगर को परिभाषित कर सकते हैं जो अनुक्रम का उपयोग करके प्राथमिक कुंजी मान को स्वचालित रूप से पॉप्युलेट करता है
CREATE OR REPLACE TRIGGER trigger_name
BEFORE INSERT ON table_name
FOR EACH ROW
BEGIN
SELECT name_of_sequence.nextval
INTO :new.primary_key_column
FROM dual;
END;
यदि आप Oracle 11.1 या उसके बाद का उपयोग कर रहे हैं, तो आप ट्रिगर को थोड़ा सरल कर सकते हैं
CREATE OR REPLACE TRIGGER trigger_name
BEFORE INSERT ON table_name
FOR EACH ROW
BEGIN
:new.primary_key_column := name_of_sequence.nextval;
END;
यदि आप वास्तव में उपयोग करना चाहते हैं SYS_GUID
CREATE TABLE table_name (
primary_key_column raw(16) default sys_guid() primary key,
<<other columns>>
)
CACHE 100; in CREATE SEQUENCE name_of_sequence START WITH 1 INCREMENT BY 1 CACHE 100;
है?
SYS_GUID()
है RAW(16)
, 32 नहीं।
SYS_GUID
प्रलेखन एक वाणी raw(32)
जो मुझे उलझन में।
Oracle 12c में आप कुछ ऐसा कर सकते हैं,
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;
/
IDENTITY
इस उत्तर में उदाहरण बहुत स्पष्ट है।
WHEN (new.MAP_ID IS NULL)
स्वीकार किए जाते हैं जवाब में नहीं है। Upvoted।
WHEN ( new.MAP_ID is null)
इस मामले में एक अच्छा कोड नहीं है और पहले से ही स्वीकृत जवाब के तहत @ABCade द्वारा टिप्पणी अनुभाग में समझाया गया है .. एक पढ़ा है;)
CREATE OR REPLACE TRIGGER
के लिए END;
, मैं एक "बांध दर्ज" विंडो मिलता है। अगर मैं "लागू करें" पर क्लिक करता हूं और उस विंडो में कुछ और नहीं करता हूं, और फिर ALTER TRIGGER
कमांड चलाता है , तो सब अच्छा है, लेकिन काश प्रोग्राम को उस पॉप-अप से छुटकारा पाने और सब कुछ एक साथ चलाने का एक तरीका था। यदि आप इसे पूरी तरह से आजमाते हैं, तो आप PLS-00103: Encountered the symbol 'ALTER'
इसे प्राप्त करते हैं और इसे पसंद नहीं करते हैं EXECUTE IMMEDIATE
, या तो (एक ही त्रुटि, बस इसके Encountered the symbol 'EXECUTE'
बजाय कहते हैं )।
[42000][907] ORA-00907: missing right parenthesis
ओरेकल 12 सी के लिए संस्करण चलाते समय मुझे मिला । कोई उपाय ?
यहाँ तीन स्वाद हैं:
RAW
डेटाटाइप के रूप में विश्व स्तर पर एकात्मक पहचानकर्ता ।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;
/
अपडेट करें:
Oracle 12c इन दो वेरिएंट को प्रस्तुत करता है जो ट्रिगर पर निर्भर नहीं करते हैं:
create table mytable(id number default mysequence.nextval);
create table mytable(id number generated as identity);
पहले वाला पारंपरिक तरीके से अनुक्रम का उपयोग करता है; दूसरा आंतरिक रूप से मूल्य का प्रबंधन करता है।
मान लें कि आप SQL सर्वर पहचान स्तंभ की तरह एक स्तंभ है?
Oracle में, आप उसी कार्यक्षमता को प्राप्त करने के लिए एक SEQUENCE का उपयोग करते हैं। मैं देखूंगा कि क्या मैं एक अच्छा लिंक पा सकता हूं और इसे यहां पोस्ट कर सकता हूं।
अद्यतन: ऐसा लगता है जैसे आपने इसे स्वयं पाया। यहाँ लिंक वैसे भी है: http://www.techonthenet.com/oracle/fterences.php
ओरेकल डेटाबेस 12 सी ने पहचान, एक ऑटो-वृद्धिशील (सिस्टम-जनरेटेड) कॉलम पेश किया। पिछले डेटाबेस संस्करणों में (11 जी तक), आप आमतौर पर एक अनुक्रम और एक ट्रिगर बनाकर एक पहचान को लागू करते हैं। 12 सी से आगे, आप अपनी खुद की तालिका बना सकते हैं और पहचान के रूप में उत्पन्न होने वाले कॉलम को परिभाषित कर सकते हैं।
निम्नलिखित लेख बताता है कि इसका उपयोग कैसे करें:
Trigger
और Sequence
इसका उपयोग तब किया जा सकता है जब आप क्रमबद्ध संख्या चाहते हैं जिसे कोई भी आसानी से पढ़ / याद / समझ सकता है। लेकिन अगर आप इस तरह से ID Column (जैसे emp_id) का प्रबंधन नहीं करना चाहते हैं, और इस कॉलम का मूल्य बहुत अधिक नहीं है, तो आप SYS_GUID()
इस तरह से Auto Increment प्राप्त करने के लिए Table Creation का उपयोग कर सकते हैं ।
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
कॉलम में अद्वितीय मूल्य सम्मिलित करेगा ।
SYS_GUID()
इसकी आईडी मान भी होगी?
Oracle 12c के साथ शुरू होने से दो में से एक तरीके से पहचान कॉलम का समर्थन होता है:
अनुक्रम + तालिका - इस समाधान में आप अभी भी एक क्रम बनाते हैं जैसा कि आप सामान्य रूप से करेंगे, तो आप निम्नलिखित DDL का उपयोग करते हैं:
माईटेबल (ID NUMBER DEFAULT MyTable_Seq.NEXTVAL , ...)
केवल तालिका - इस समाधान में कोई अनुक्रम स्पष्ट रूप से निर्दिष्ट नहीं है। आप निम्नलिखित DDL का उपयोग करेंगे:
माईटेबल (आईडी के रूप में जेनरेट की गई आईडी , ...)
यदि आप पहले तरीके का उपयोग करते हैं तो यह चीजों को करने के मौजूदा तरीके के साथ संगत है। दूसरा थोड़ा अधिक सीधा है और बाकी RDMS सिस्टम के साथ अधिक इनलाइन है।
इसे कहा जाता है Identity Columns
और यह केवल oracle Oracle 12c से उपलब्ध है
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 पर त्रुटि: ORA-32795: एक उत्पन्न हमेशा पहचान कॉलम में सम्मिलित नहीं कर सकता
INSERT INTO identity_test_tab (id, description) VALUES (999, 'ID=999 and DESCRIPTION');
पंक्ति 1 पर त्रुटि: ORA-32795: एक उत्पन्न हमेशा पहचान कॉलम में सम्मिलित नहीं कर सकता
यहां ऑटो इंक्रीमेंट के लिए संपूर्ण सॉल्यूशन wrt अपवाद / एरर हैंडलिंग है, यह सॉल्यूशन बैकवर्ड कम्पैटिबल है और 11g और 12c पर काम करेगा, खासकर अगर एप्लिकेशन प्रोडक्शन में है।
कृपया 'TABLE_NAME' को अपने उपयुक्त तालिका नाम से बदलें
--checking if table already exisits
BEGIN
EXECUTE IMMEDIATE 'DROP TABLE TABLE_NAME';
EXCEPTION WHEN OTHERS THEN NULL;
END;
/
--creating table
CREATE TABLE TABLE_NAME (
ID NUMBER(10) PRIMARY KEY NOT NULL,
.
.
.
);
--checking if sequence already exists
BEGIN
EXECUTE IMMEDIATE 'DROP SEQUENCE TABLE_NAME_SEQ';
EXCEPTION WHEN OTHERS THEN NULL;
END;
--creating sequence
/
CREATE SEQUENCE TABLE_NAME_SEQ START WITH 1 INCREMENT BY 1 MINVALUE 1 NOMAXVALUE NOCYCLE CACHE 2;
--granting rights as per required user group
/
GRANT SELECT, INSERT, UPDATE, DELETE ON TABLE_NAME TO USER_GROUP;
-- creating trigger
/
CREATE OR REPLACE TRIGGER TABLE_NAME_TS BEFORE INSERT OR UPDATE ON TABLE_NAME FOR EACH ROW
BEGIN
-- auto increment column
SELECT TABLE_NAME_SEQ.NextVal INTO :New.ID FROM dual;
-- You can also put some other required default data as per need of your columns, for example
SELECT SYS_CONTEXT('USERENV', 'SESSIONID') INTO :New.SessionID FROM dual;
SELECT SYS_CONTEXT('USERENV','SERVER_HOST') INTO :New.HostName FROM dual;
SELECT SYS_CONTEXT('USERENV','OS_USER') INTO :New.LoginID FROM dual;
.
.
.
END;
/
ऐसा मैंने मौजूदा तालिका और कॉलम (आईडी नाम) पर किया है:
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;
FUNCTION GETUNIQUEID_2 RETURN VARCHAR2
AS
v_curr_id NUMBER;
v_inc NUMBER;
v_next_val NUMBER;
pragma autonomous_transaction;
begin
CREATE SEQUENCE sequnce
START WITH YYMMDD0000000001
INCREMENT BY 1
NOCACHE
select sequence.nextval into v_curr_id from dual;
if(substr(v_curr_id,0,6)= to_char(sysdate,'yymmdd')) then
v_next_val := to_number(to_char(SYSDATE+1, 'yymmdd') || '0000000000');
v_inc := v_next_val - v_curr_id;
execute immediate ' alter sequence sequence increment by ' || v_inc ;
select sequence.nextval into v_curr_id from dual;
execute immediate ' alter sequence sequence increment by 1';
else
dbms_output.put_line('exception : file not found');
end if;
RETURN 'ID'||v_curr_id;
END;
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;
12 सी में oracle के अनुक्रम और पहचान कॉलम हैं
http://www.oracle-base.com/articles/12c/identity-columns-in-oracle-12cr1.php#identity-columns
मुझे यह पता चला लेकिन यह निश्चित नहीं था कि rdb 7 http://www.oracle.com/technetwork/products/rdb/0307-identity-columns-128126.pdf है
create trigger t1_trigger
before insert on AUDITLOGS
for each row
begin
select t1_seq.nextval into :new.id from dual;
end;
केवल मुझे आपकी तालिका के नाम के साथ तालिका नाम (AUDITLOGS) और new.column_name के साथ नया नाम बदलना होगा
शायद इस सरल स्क्रिप्ट की कोशिश करो:
परिणाम है:
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;
select
आधुनिक ओरेकल संस्करणों की आवश्यकता नहीं है । आप बस :new.pk := TABLE_PK_SEQ.NEXTVAL
BEFORE INSERT
ऑटो-इंक्रीमेंट बनाने के लिए मेज पर एक ट्रिगर बना सकते हैं और एक क्रम से मान खींच सकते हैं