programing

Oracle - 자동 증분 ID를 사용하여 새 행 삽입

batch 2023. 3. 2. 22:05
반응형

Oracle - 자동 증분 ID를 사용하여 새 행 삽입

워크큐 테이블에는 워크큐 열이 있습니다. ★★★아이디 id id id id id id id id 。할 수 있는 ?아이디 ★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★?
Null " " " ORA01400 - Null insert inter workid " " " 。

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

지금까지 시도했던 것 - 표의 세부사항을 살펴보려고 했지만 자동 증가하지 않았습니다.테이블 스크립트는 다음과 같습니다.

"WORKID" NUMBER NOT NULL ENABLE,

데이터베이스:Oracle 10g

이치노 여기에 이미지 설명 입력


답변:

도움에 대해 한 사람 한 사람에게 감사드려요.오늘은 좋은 학습 경험이었고, 여러분의 도움이 없었다면 저는 할 수 없었을 것입니다.결론은 이미 시퀀스와 트리거가 있는 테이블에 행을 삽입하려고 했습니다.제가 해야 할 일은 제 질문에 대한 올바른 시퀀스를 찾아 그 시퀀스를 제 쿼리에 호출하는 것이었습니다.

이 workid 열에 해당하는 시퀀스를 검색하여 찾을 수 있도록 도와준 링크입니다.여러분 덕분에 모두에게 엄지손가락을 치켜세웠습니다.오늘은 또 다른 용과 씨름하여 환자 치료를 한 걸음 더 나아갈 수 있게 되었습니다.

트리거나 시퀀스를 사용하지 않고 간단하게 실행할 수 있습니다.

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

저에겐 효과가 있었지만 빈 테이블에서는 작동하지 않을 것 같아요.

자동 증분 번호를 얻으려면 Oracle에서 시퀀스를 사용해야 합니다.(여기와 여기참조).

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

Oracle에는 기본 제공 auto_increment가 없습니다.

'어울리다'를 써야 요.sequences ★★★★★★★★★★★★★★★★★」triggers.

올바른 작업 방법을 읽어보십시오. ("Oracle에서 자동 증가 열 작성"에 대한 단계별 사용 방법)

ELXAN@DB1> create table cedvel (id integer, ad varchar2(15));
테이블이 생성되었습니다.

ELXAN@DB1> 변경 테이블 cedvel add 제약조건 pk_ad 프라이머리 키(id;
테이블이 변경되었습니다.

ELXAN@DB1> create seq test_seq start는 1씩 증분합니다.
시퀀스가 작성되었습니다.

ELXAN@DB1> 트리거 ad_insert 작성 또는 치환삼나무에 삽입하기 전에새로운 것을 낡은 것으로 참조하다각 행마다시작한다.듀얼에서 :new.id으로 test_seq.nextval을 선택합니다.종료./  2    3    4    5    6    7    8
트리거가 생성되었습니다.

ELXAN@DB1> cedvel(ad) 값('nese')에 삽입합니다.

행이 1개 작성되었습니다.

할 수 .SEQUENCE ★★★★★★★★★★★★★★★★★」TRIGGER 내의 의 값을 으로 증가시키려면 , 「」를 사용합니다.TRIGGERS더 적절할 것 같습니다.적절한 예시와 함께 트리거와 함께 사용되는 major 구가 포함된 Oracle의 다음 설명서를 참조하십시오.

CREATE TRIGGER 문을 사용하여 다음과 같은 데이터베이스 트리거를 만들고 활성화합니다.

  • 테이블, 스키마 또는 데이터베이스와 관련된 저장된 PL/SQL 블록 또는

  • 익명 PL/SQL 블록 또는 PL/SQL 또는 Java에서 구현된 프로시저 호출

Oracle Database는 지정된 조건이 발생하면 자동으로 트리거를 실행합니다.보세요.


다음은 간단한 설명입니다.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;

WORD는 으로 '있다'는 등의 값을 합니다.CT0001,CT0002,CT0002등이며 지정된 표의 지정된 열에 삽입합니다.

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;

/

완전한 노하우 방법, 트리거와 시퀀스의 예를 포함했습니다.

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

이 기능은 Oracle 12c에서 지원되고 있습니다.그리고 아마 방아쇠가 접근하는 것보다 더 빠르겠지예를 들어 다음과 같습니다.

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 ) ;

최적의 접근법: 시퀀스에서 다음 값을 얻습니다.

은 ""를 입니다.NEXTVAL SEQUENCE테이블과 "관련"되어 있습니다.시퀀스는 특정 테이블과 직접 관련되어 있지 않기 때문에 시퀀스 이름 표기법에서 대응하는 테이블을 수동으로 참조해야 합니다.

테이블에서 사용되는 시퀀스 이름은 시퀀스 명명 규칙을 따를 경우 테이블 이름 안에 테이블 이름이 표시됩니다.<table_name>_SEQ이데올로기 때문에

먼저 Oracle 시스템 내에 테이블에 "관련된" 시퀀스가 있는지 확인합니다.

SELECT * FROM all_sequences
WHERE SEQUENCE_OWNER = '<schema_name>';

이런 걸 보여드릴게요

잡아!SEQUENCE_NAMENEXTVAL 중 한 가지INSERT

INSERT INTO workqueue(id, value) VALUES (workqueue_seq.NEXTVAL, 'A new value...')

추가 힌트

잘 , 바랍니다.LAST_NUMBER시퀀스(현재 값을 의미)의 최대 ID를 지정합니다.예측되는 것은LAST_NUMBER갭이 너무 크지 않은 한 테이블 내의 현재 최대 ID 값 이상입니다.

SELECT LAST_NUMBER
FROM all_sequences
WHERE SEQUENCE_OWNER = '<schema_name>' AND SEQUENCE_NAME = 'workqueue_seq';

SELECT MAX(ID)
FROM workqueue;

레퍼런스:Oracle CURRVAL 및 NEXTVAL

다른 방법: 테이블에서 현재 최대 ID를 가져옵니다.

다른 방법은 표에서 최대값을 얻는 것입니다. 같은 질문의 Zsolt Sky 답변을 참조하십시오.

트리거나 시퀀스를 사용하지 않고 간단하게 실행할 수 있습니다.

WORKQUUE(ID, 설비 코드, 작업 조치, 설명) 값((WORKUUE에서 카운트(1)+1 선택), 'J', 'II', 'TESTVALUES')에 삽입합니다.

참고: 여기서는 max(id) 열 대신 count(1)를 사용해야 합니다.

빈 테이블에서도 완벽하게 작동합니다.

언급URL : https://stackoverflow.com/questions/8717675/oracle-insert-new-row-with-auto-incremental-id

반응형