programing

null을 삽입할 때 기본값 삽입

powerit 2023. 8. 21. 21:42
반응형

null을 삽입할 때 기본값 삽입

Oracle 데이터베이스와 null이 아닌 열이 여러 개 있는 테이블이 있으며 모두 기본값입니다.

삽입할 데이터에 대해 하나의 삽입 문을 사용하고 싶으며 삽입된 값이 null인지 여부는 확인하지 않습니다.

null을 삽입할 때 기본 열 값으로 되돌리는 방법이 있습니까?

다음 코드가 있습니다.

<?php
if (!empty($values['not_null_column_with_default_value'])) {
    $insert = "
        INSERT INTO schema.my_table
            ( pk_column, other_column, not_null_column_with_default_value)
        VALUES
            (:pk_column,:other_column,:not_null_column_with_default_value)
     ";
} else {
    $insert = "
        INSERT INTO schema.my_table
            ( pk_column, other_column)
        VALUES
            (:pk_column,:other_column)
     ";        
}

따라서 열을 완전히 생략해야 합니다. 그렇지 않으면 "null을 삽입하여 null을 삽입하지 않습니다." 오류가 발생합니다.물론 나는 여러 개의 null 가능한 열을 가지고 있기 때문에 코드 create insert 문은 매우 읽기 어렵고 추하며 나는 그런 방식이 싫습니다.

저는 다음과 유사한 한 가지 진술을 하고 싶습니다.

INSERT INTO schema.my_table
    ( pk_column, other_column, not_null_column_with_default_value)
VALUES
    (:pk_column,:other_column, NVL(:not_null_column_with_default_value, DEFAULT) );

물론 그것은 가상의 질문입니다.Oracle DBMS를 통해 이 목표를 달성할 수 있는 방법을 알고 계십니까?

편집:

모두 답변해 주셔서 감사합니다.제가 원하는 것을 달성할 수 있는 "표준" 방법이 없는 것 같습니다. 그래서 저는 IMO의 최선의 답변을 받아들였습니다.내가 너무 똑똑해지는 것을 멈추고 자동으로 작성된 문을 통해 null 값을 생략하는 것을 고수해야 한다는 것입니다.

정확히 제가 보고 싶은 것은 아니지만, 더 나은 선택은 없습니다.

지금 이 책을 읽는 사람들을 위해:

Oracle 12c에는 DEFAULT ON NULL이라는 새로운 기능이 있습니다. 예:

CREATE TABLE tab1 (
  col1        NUMBER DEFAULT 5,
  col2        NUMBER DEFAULT ON NULL 7,
  description VARCHAR2(30)
);

따라서 col2에 null을 삽입하려고 하면 자동으로 7이 됩니다.

이 AskTom 스레드에서 설명한 바와 같이,DEFAULT키워드는 열 삽입에서 독립 실행형 식으로만 사용할 수 있으며 NVL과 같은 함수 또는 식과 함께 사용할 경우에는 사용할 수 없습니다.

즉, 유효한 쿼리입니다.

INSERT INTO schema.my_table
    ( pk_column, other_column, not_null_column_with_default_value)
VALUES
    (:pk_column,:other_column, DEFAULT)

모든 행과 바인딩 변수 또는 변수가 null인 경우 상수 DEFAULT에 동적 쿼리를 사용할 수 있습니다. " 은이문을열교체는것하간있다수습니단할만큼것자다▁the▁string있니▁this▁replacing습▁be▁simple▁as수▁could▁as"를 대체하는 것처럼 간단할 수 있습니다.:not_null_column_with_default_value 악기로로DEFAULT의 신의에$insert.

.ALL_TAB_COLUMNS 및사를 합니다.nvl(:your_variable, :column_default)은 기값은 입니다.DATA_DEFAULT.

저는 당신의 INSERT-statement에 그것들을 언급하지 않는 것이 가장 깨끗한 방법이라고 생각합니다.기본값을 채우기 위해 트리거를 작성하기 시작할 수 있지만, 이는 목표에 비해 무거운 갑옷입니다.

당신의 애플리케이션 코드를 조금 재구성하는 것이 가능하지 않나요?PHP에서는 다음과 같이 지저분하지 않고 깨끗한 INSERT 문을 구성할 수 있습니다.

<?php
$insert['column_name1'] = 'column_value1';
$insert['column_name2'] = 'column_value2';
$insert['column_name3'] = '';
$insert['column_name4'] = 'column_value4';

// remove null values
foreach ($insert as $key => $value) {
  if (is_null($value) || $value=="") {
    unset($insert[$key]);
  }
}

// construct insert statement
$statement = "insert into table (". implode(array_keys($insert), ',') .") values (:". implode(array_keys($insert), ',:') .")";

// call oci_parse
$stid = oci_parse($conn, $statement);

// bind parameters
foreach ($insert as $key => $value) {
  oci_bind_by_name($stid, ":".$key, $value);
}

// execute!
oci_execute($stid);
?>

성능을 위한 더 나은 옵션은 첫 번째 옵션입니다.

어쨌든, 제가 이해한 바와 같이, 당신은 수정하기 어렵기 때문에 삽입 열 이름과 값을 반복하는 것을 원하지 않는 것으로 알고 있습니다.사용할 수 있는 또 다른 옵션은 반환되는 절과 함께 다음과 같은 업데이트가 있는 삽입을 실행하는 것입니다.

INSERT INTO schema.my_table
    ( pk_column, other_column, not_null_column_with_default_value)
VALUES
    (:pk_column,:other_column, :not_null_column_with_default_value)
RETURNING not_null_column_with_default_value 
INTO :insered_value

PHP로 작동하는 것 같습니다.

이 후에는 다음 항목을 확인할 수 있습니다.nullinsered_value바인딩 변수입니다.null인 경우 다음 업데이트를 실행할 수 있습니다.

UPDATE my_table
   SET not_null_column_with_default_value  = DEFAULT
 WHERE  pk_column = :pk_column: 

삽입할 데이터에 대해 하나의 삽입 문을 사용하고 싶으며 삽입된 값이 null인지 여부는 확인하지 않습니다.

해당 열의 기본값으로 테이블을 정의합니다.예:

create table myTable
(
  created_date date default sysdate,
  ...
)
tablespace...

또는 기존 테이블을 변경합니다.

alter table myTable modify(created_date default sysdate);

이제 사용자(또는 내 테이블을 사용하는 사용자)는 기본값에 대해 걱정할 필요가 없습니다.이 예에서는 열이 여전히 null이므로 누군가가 명시적으로 null을 삽입할 수 있습니다.이 옵션을 사용하지 않으려면 열도 null로 만들지 마십시오.

편집: 위의 작업이 이미 완료되었다고 가정하면 삽입문에 DEFAULT 키워드를 사용할 수 있습니다.저는 이것에 대한 트리거를 피할 것입니다.

언급URL : https://stackoverflow.com/questions/5388778/insert-default-value-when-null-is-inserted

반응형