2016-04-06 25 views
1

İlk gönderi işte bu yüzden bana kolay git :). Hazırlanan deyimden otomatik oluşturulan birincil anahtar kimliği

Yani Aşağıdaki kodu kullanarak bir veritabanı tablosu oluşturdu. (Im Oracle 10g ve Oracle JDBC kullanarak. Im bu servlet kod yaptığım bir HTML formu ile iletişim sahip.)

CREATE TABLE GM_Recipes 
(
    recipe_ID NUMBER(4) PRIMARY KEY, 
    rec_name VARCHAR2(50), 
    recipe_cat VARCHAR2(50), 
    rec_desc VARCHAR2(1000), 
    author VARCHAR2(50) 
); 

Şimdi benim servlet kodudur örneğin:

Ben bariz bir reçete kimliğini girmek için birini istemez ne kimliği GM_Recipes tabloya bir satır eklemek yapmak ister ama recipe_ID oto üretilebilir olması (bir HTML formu aracılığıyla itibariyle
// Fill Recipes table 
     PreparedStatement pstmt = con.prepareStatement("INSERT INTO GM_Recipes(rec_name,recipe_cat,rec_desc,author) VALUES (?,?,?,?)"); 
     pstmt.clearParameters(); 

     String opt1 = req.getParameter("RecName"); //parameters from HTML form 
     String opt2 = req.getParameter("choice"); //parameters from HTML form 
     String opt3 = req.getParameter("CookDesc"); //parameters from HTML form 
     String opt4 = req.getParameter("author"); //parameters from HTML form 

     pstmt.setString(1,opt1); 
     pstmt.setString(2,opt2); 
     pstmt.setString(3,opt3); 
     pstmt.setString(4,opt4); 

     ResultSet rs = pstmt.executeQuery(); 

. nedenleri)

Kodun ilerleyen kısımları, oluşturulacak yeni tarifler için bir recipe_ID'ye bağımlı.

Ive bazı anahtarları ben google dan buldum kodu üretmek ama birkaç saat ona olmuş ve herkes & 11g otomatik artış sütunlar 10g bazı anlamlı fikir :) Teşekkür

+0

Ben zaten bu kodun herhangi önce tabloya bazı verileri/kodlanma takılı bahsetmeliyiz geri PreparedStatement koduna eklemek için increm değişkeni kullanılır. (Ben sql kodunu yazarken) Yani şu anda GM_Recipes tablosunda 3 'test' tarifleri var. SO tabloya yeni bir reçete eklerseniz, bir recipe_ID 4 üretilecek vb (tabloya eklenen her yeni tarifi ile artışlar) istiyorum. – ForgottenGhost

cevap

0

paylaşırsanız meraklı ettik çalıştı mevcut değil. Adlandırılmış bir sıra, bir tetikleyici oluşturmalı ve birincil anahtarınızı tohumlamak için nextval ifadeyi kullanmalısınız.

--create sequence seq_gm_recipes; 
--this would work, if your table doesn't have records yet 
--otherwise use the below 
declare i_start int; 
begin 
    select max(recipe_id)+1 into i_start from GM_Recipes; 
    execute immediate 'create sequence seq_gm_recipes start with ' || i_start; 
end; 

CREATE OR REPLACE TRIGGER trg_GM_Recipes 
BEFORE INSERT ON GM_Recipes 
REFERENCING NEW AS New OLD AS Old 
FOR EACH ROW 
DECLARE 
    l_Var NUMBER; 
BEGIN 
    SELECT seq_gm_recipes.NEXTVAL INTO l_Var FROM dual; 
    :NEW.recipe_id := l_Var; 
END; 

Bu, doğrudan sql * plus veya TOAD içinde yürütülecek PL/SQL'dir.

Bir dizi db tarafı kimliği oluşturmak için kullanırlar, (en YOUR_SEQUENCE diyelim) oluşturmalıdır
2

:

PreparedStatement pstmt = con.prepareStatement("INSERT INTO GM_Recipes(recipe_id, rec_name,recipe_cat,rec_desc,author) VALUES (YOUR_SEQUENCE.nextval, ?,?,?,?)"; 

dip not Bu tabloda zaten kayıtlarınız varsa, uygun bir sıralama başlangıç ​​değeri için dikkat edin.

0

Yardımlarınız için teşekkürler!

Alışılmadık bir yöntem gerçekleştirdim ve çalışmayı istediğimi aldım.

stmt22 = con.createStatement();  
ResultSet ChoMax = stmt22.executeQuery(""); 
ChoMax.next(); 

int increm = ((Number) ChoMax.getObject(1)).intValue(); 
if(increm != 0){increm++;} 

Sonra

İlgili konular