2012-01-03 8 views
25

के साथ नई पंक्ति डालें मेरे पास वर्कक्यू टेबल है जिसमें वर्कड कॉलम है। वर्कआईडी कॉलम में वे मान होते हैं जो स्वचालित रूप से बढ़ते हैं। क्या कोई तरीका है कि मैं बैकएंड में एक नई पंक्ति डालने के लिए एक क्वेरी चला सकता हूं और वर्कआईडी कॉलम स्वचालित रूप से बढ़ाना चाहता हूं?
जब मैं एक नल डालने का प्रयास करता हूं, तो यह त्रुटि ORA01400 फेंकता है - वर्कड में शून्य डालने नहीं कर सकता।ओरेकल - ऑटो वृद्धिशील आईडी

insert into WORKQUEUE (facilitycode,workaction,description) values ('J', 'II', 'TESTVALUES') 

क्या मैं अब तक की कोशिश की है - मैं तालिका विवरण को देखने के लिए करने की कोशिश की और किसी भी स्वत वेतन वृद्धि नहीं देखा। Oracle 10g

कुछ मौजूदा डेटा का स्क्रीनशॉट: तालिका स्क्रिप्ट का पालन के रूप में

"WORKID" NUMBER NOT NULL ENABLE, 

डाटाबेस है। enter image description here


उत्तर:

मैं मदद के लिए प्रत्येक और हर किसी को धन्यवाद देना है। आज एक महान सीखने का अनुभव था और आपके समर्थन के बिना, मैं नहीं कर सका। नीचे की रेखा है, मैं एक पंक्ति में एक पंक्ति डालने की कोशिश कर रहा था जिसमें पहले से ही अनुक्रम और ट्रिगर्स हैं। मुझे बस इतना करना था कि मेरे प्रश्न के लिए सही अनुक्रम मिला, और मेरी क्वेरी में अनुक्रम को कॉल करें।

आपके द्वारा प्रदान किए गए लिंक मुझे इन अनुक्रमों को देखने में मदद करते हैं और इस वर्कड कॉलम के लिए एक ढूंढते हैं। धन्यवाद करने के लिए आप सभी, मैं एक अंगूठे हर किसी को दे दी है, मैं आज एक और अजगर से निपटने और मदद रोगी की देखभाल एक कदम आगे आएं करने में सक्षम हूँ! "

+0

[ओरेकल - संभावित कॉलम को एक कॉलम को स्वतः बढ़ाने के लिए संशोधित करें] के संभावित डुप्लिकेट (http://stackoverflow.com/questions/7681122/oracle-modify-an-existing-table-to-auto-increment-a -column) – Li0liQ

+0

@ Li0liQ - नहीं, मैं तालिका को संशोधित करने की कोशिश नहीं कर रहा हूं। मैं बस मौजूदा तालिका में जिस तरह से एक नई पंक्ति डालना चाहता हूं। – Shaji

+0

शाजी: सहायक उत्तरों को अप-वोट करना न भूलें और सबसे उपयोगी के रूप में इसे चुनें और इसे स्वीकार करें। (देखें [एफएक्यू] (http://stackoverflow.com/faq)।) –

उत्तर

12

एक ऑटो वेतन वृद्धि नंबर आप की जरूरत प्राप्त करने के लिए ओरेकल में अनुक्रम का उपयोग करने के लिए। (देखें here और here)।

CREATE SEQUENCE my_seq; 

SELECT my_seq.NEXTVAL FROM DUAL; -- to get the next value 

-- use in a trigger for your table demo 
CREATE OR REPLACE TRIGGER demo_increment 
BEFORE INSERT ON demo 
FOR EACH ROW 

BEGIN 
    SELECT my_seq.NEXTVAL 
    INTO :new.id 
    FROM dual; 
END; 
/
+0

क्या आप कृपया मेरे प्रश्न का उत्तर दे सकते हैं? मेरे पास मेरे प्रश्न का उत्तर देने और इसे बंद करने के लिए पर्याप्त प्रतिष्ठा नहीं है। कृपया नीचे इस कृतज्ञता को कॉपी और पेस्ट करें: "आपको एक और सभी का धन्यवाद।" मेरे समाधान के लिए, कृपया मेरे प्रश्न के तहत देखें। " – Shaji

17

कोई अंतर्निहित Oracle में auto_increment।

आप की जरूरत है sequences और triggers उपयोग करने के लिए।

पढ़ें here कैसे इसे सही करने के। (चरण-दर-चरण कैसे-करें "Oracle में ऑटो वेतन वृद्धि स्तंभ बनाना" के लिए)

+0

वास्तव में मुझे वास्तव में अच्छी युक्तियाँ चाहिए। बहुत बहुत धन्यवाद +1 –

2

आप अपने डेटाबेस तालिका में स्वचालित रूप से किसी दिए गए स्तंभ का मान बढ़ाने के लिए या तो SEQUENCE या TRIGGER उपयोग कर सकते हैं लेकिन TRIGGERS के उपयोग अधिक उपयुक्त होगा। ओरेकल के निम्नलिखित दस्तावेज देखें जिसमें उपयुक्त उदाहरणों के साथ ट्रिगर्स के साथ उपयोग किए जाने वाले प्रमुख खंड शामिल हैं।

बना सकते हैं और एक डेटाबेस ट्रिगर है, जो सक्षम करने के लिए बनाएँ TRIGGER बयान का उपयोग करें:

  • एक संग्रहीत PL/SQL एक मेज, एक स्कीमा, या डेटाबेस या

  • के साथ जुड़े ब्लॉक
  • एक अनाम PL/SQL ब्लॉक या PL/SQL या जावा

में लागू एक प्रक्रिया के लिए एक कॉल

निर्दिष्ट शर्तों होने पर ओरेकल डेटाबेस स्वचालित रूप से एक ट्रिगर निष्पादित करता है।See


के बाद किया जाता है एक सरल TRIGGER सिर्फ इतना है कि उस स्तंभ के अधिकतम मूल्य के आधार पर एक निर्धारित तालिका में प्राथमिक कुंजी मान सम्मिलित करता है आप के लिए एक उदाहरण के रूप। आप स्कीमा नाम, टेबल नाम इत्यादि को संशोधित कर सकते हैं और इसका उपयोग कर सकते हैं। इसे मात्र आजमाएं।

/*Create a database trigger that generates automatically primary key values on the CITY table using the max function.*/ 

CREATE OR REPLACE TRIGGER PROJECT.PK_MAX_TRIGGER_CITY 
BEFORE INSERT ON PROJECT.CITY 
FOR EACH ROW 
DECLARE 
    CNT NUMBER; 
    PKV CITY.CITY_ID%TYPE; 
    NO NUMBER; 
BEGIN 
    SELECT COUNT(*)INTO CNT FROM CITY; 

    IF CNT=0 THEN 
     PKV:='CT0001'; 
    ELSE 
     SELECT 'CT'||LPAD(MAX(TO_NUMBER(SUBSTR(CITY_ID,3,LENGTH(CITY_ID)))+1),4,'0') INTO PKV 
     FROM CITY; 
    END IF; 
    :NEW.CITY_ID:=PKV; 
END; 

स्वचालित रूप से निर्दिष्ट तालिका के दिए गए स्तंभ में CT0001 जैसे, CT0002, CT0002 और इतने पर और मूल्यों आवेषण उत्पन्न होगा।

3
 
[email protected]> create table cedvel(id integer,ad varchar2(15)); 

Table created. 

[email protected]> alter table cedvel add constraint pk_ad primary key(id); 

Table altered. 

[email protected]> create sequence test_seq start with 1 increment by 1; 

Sequence created. 

[email protected]> create or replace trigger ad_insert 
before insert on cedvel 
REFERENCING NEW AS NEW OLD AS OLD 
for each row 
begin 
    select test_seq.nextval into :new.id from dual; 
end; 
/2 3 4 5 6 7 8 

Trigger created. 

[email protected]> insert into cedvel (ad) values ('nese'); 

1 row created. 
1
SQL trigger for automatic date generation in oracle table: 

CREATE OR REPLACE TRIGGER name_of_trigger 

BEFORE INSERT 

ON table_name 

REFERENCING NEW AS NEW 

FOR EACH ROW 

BEGIN 

SELECT sysdate INTO :NEW.column_name FROM dual; 

END; 

/

1

पूरा पता है कि, मैं ट्रिगर के एक उदाहरण और अनुक्रम

create table temasforo(
idtemasforo NUMBER(5) PRIMARY KEY, 
autor  VARCHAR2(50) NOT NULL, 
fecha  DATE DEFAULT (sysdate), 
asunto  LONG ); 

create sequence temasforo_seq 
    start with 1 
    increment by 1 
    nomaxvalue; 

create or replace 
trigger temasforo_trigger 
    before insert on temasforo 
    referencing OLD as old NEW as new 
    for each row 
    begin 
     :new.idtemasforo:=temasforo_seq.nextval; 
    end; 

संदर्भ में शामिल हैं: http://thenullpointerexceptionx.blogspot.mx/2013/06/llaves-primarias-auto-incrementales-en.html

+0

दूसरी पंक्ति में" idtemasfor "होना चाहिए" idtemasforo "? – ragerdl

+0

हो! हाँ, अवलोकन के लिए धन्यवाद! –

1

पूर्णता के लिए, मैं उल्लेख करेंगे कि ओरेकल 12 सी इस सुविधा का समर्थन करता है। यह ट्रिगर दृष्टिकोण से भी तेजी से तेज है। उदाहरण के लिए:

CREATE TABLE foo 
    (
    id NUMBER GENERATED BY DEFAULT AS IDENTITY (
    START WITH 1 NOCACHE ORDER) NOT NULL , 
    name  VARCHAR2 (50) 
) 
    LOGGING ; 
ALTER TABLE foo ADD CONSTRAINT foo_PK PRIMARY KEY (id) ; 
1

यह किसी भी चलाता या दृश्यों के बिना यह करने के लिए एक आसान तरीका है:

insert into WORKQUEUE (ID, facilitycode, workaction, description) 
    values ((select max(ID)+1 from WORKQUEUE), 'J', 'II', 'TESTVALUES') 

यह मेरे लिए काम किया लेकिन एक खाली टेबल के साथ काम नहीं करेंगे, मुझे लगता है।

+0

एक खाली खाली टेबल के लिए बिल्कुल सही, सौदा करने की आवश्यकता नहीं है उस दृष्टिकोण के साथ ट्रिगर या अनुक्रम के साथ। – Siick

संबंधित मुद्दे