2012-01-03 36 views
25

Tôi có bảng làm việc có cột workid. Cột workID có các giá trị tăng tự động. Có cách nào tôi có thể chạy một truy vấn trong backend để chèn một hàng mới và có tăng workID cột tự động?
Khi tôi cố gắng để chèn một null, nó ném lỗi ORA01400 - Không thể chèn null vào workid.Oracle - Chèn hàng mới có ID gia tăng tự động

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

Tôi đã cố gắng xem chi tiết bảng và không thấy bất kỳ tự động tăng nào. Kịch bản bảng là như sau

"WORKID" NUMBER NOT NULL ENABLE, 

Cơ sở dữ liệu: Oracle 10g

Ảnh chụp màn hình của một số dữ liệu hiện có. enter image description here


ĐÁP:

tôi phải cảm ơn từng người và mọi người đã giúp đỡ. Hôm nay là một trải nghiệm học tập tuyệt vời và không có sự hỗ trợ của bạn, tôi không thể làm được. Điểm mấu chốt là, tôi đã cố gắng để chèn một hàng vào một bảng đã có trình tự và kích hoạt. Tất cả những gì tôi phải làm là tìm chuỗi đúng, cho câu hỏi của tôi và gọi chuỗi đó vào truy vấn của tôi.

Các liên kết bạn đã cung cấp cho tôi đã giúp tôi xem xét các chuỗi này và tìm ra chuỗi liên kết cho cột workid này. Nhờ tất cả các bạn, tôi đã tất cả mọi người một ngón tay cái lên, tôi có thể giải quyết rồng khác hôm nay và giúp chăm sóc bệnh nhân có một bước về phía trước!"

+0

bản sao có thể có của [Oracle - Sửa đổi bảng hiện có để tự động tăng một cột] (http://stackoverflow.com/questions/7681122/oracle-modify-an-existing-table-to-auto-increment-a -column) – Li0liQ

+0

@ Li0liQ - Không, tôi không cố gắng sửa đổi bảng nào cả. Tôi chỉ muốn chèn một hàng mới trong bảng hiện có theo cách của nó. – Shaji

+0

Shaji: đừng quên bỏ phiếu cho những câu trả lời hữu ích và chọn câu trả lời hữu ích nhất và chấp nhận nó. (Xem [FAQ] (http://stackoverflow.com/faq).) –

Trả lời

12

để có được một số tăng tự động bạn cần sử dụng một chuỗi trong Oracle. (Xem herehere).

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

bạn có thể trả lời câu hỏi của tôi không? Tôi không có đủ danh tiếng để trả lời câu hỏi của tôi và đóng nó lại. Vui lòng sao chép và dán lòng biết ơn này bên dưới: "Cảm ơn bạn một và tất cả." Đối với giải pháp của tôi, hãy xem xét câu hỏi của tôi. " – Shaji

17

Không có built-in auto_increment trong Oracle.

Bạn cần sử dụng sequencestriggers

đọc here. làm thế nào để làm điều đó đúng. (Step-by-step cách để cho "Tạo cột auto-increment trong Oracle")

+0

Lời khuyên thực sự tốt chính xác những gì tôi cần. Cảm ơn rất nhiều +1 –

2

Bạn có thể sử dụng một trong hai SEQUENCE hoặc TRIGGER để tự động tăng giá trị của một cột được đưa ra trong bảng cơ sở dữ liệu của bạn tuy nhiên việc sử dụng TRIGGERS sẽ thích hợp hơn. Xem tài liệu sau của Oracle có chứa các mệnh đề chính được sử dụng với các trình kích hoạt với các ví dụ phù hợp.

Sử dụng các tuyên bố TRIGGER CREATE để tạo ra và cho phép kích hoạt một cơ sở dữ liệu, đó là:

  • Một khối PL/SQL được lưu trữ gắn liền với một bảng, một lược đồ, hoặc cơ sở dữ liệu hoặc

  • An/khối SQL ẩn danh PL hoặc một cuộc gọi đến một thủ tục thực hiện trong PL/SQL hoặc Java

Cơ sở dữ liệu Oracle tự động thực thi trình kích hoạt khi xảy ra các điều kiện cụ thể.See.


Sau đây là một đơn giản TRIGGER chỉ là một ví dụ cho bạn rằng chèn giá trị khóa chính trong một bảng quy định trên cơ sở giá trị tối đa của cột đó. Bạn có thể sửa đổi tên lược đồ, tên bảng vv và sử dụng nó. Chỉ cần cung cấp cho nó một thử.

/*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; 

sẽ tự động tạo ra các giá trị như CT0001, CT0002, CT0002 và vân vân và chèn vào cột nhất định của bảng quy định.

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

hoàn chỉnh biết làm thế nào, tôi đã bao gồm một ví dụ về những nguyên nhân và trình tự

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; 

tham khảo: http://thenullpointerexceptionx.blogspot.mx/2013/06/llaves-primarias-auto-incrementales-en.html

+0

" idtemasfor "có phải là" idtemasforo "trong dòng thứ hai không? – ragerdl

+0

Ho! Vâng, cảm ơn bạn đã quan sát! –

1

Để hoàn chỉnh, tôi sẽ đề cập rằng Oracle 12c không hỗ trợ tính năng này. Ngoài ra nó được cho là nhanh hơn so với phương pháp kích hoạt. Ví dụ:

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

Đây là một cách đơn giản để làm điều đó mà không cần bất kỳ lý do hoặc chuỗi:

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

Nó làm việc cho tôi nhưng sẽ không làm việc với một bàn trống, tôi đoán.

+0

Hoàn hảo cho một bảng không trống, không cần phải xử lý với trình kích hoạt hoặc chuỗi với cách tiếp cận đó. – Siick

Các vấn đề liên quan