복붙노트

[SQL] 생년월일에 제약 조건을 확인?

SQL

생년월일에 제약 조건을 확인?

나는 오라클 내 직원 테이블을 만드는 오전 및 emp_date 위해 나는 그렇게 출생의 날짜가 돌아 오는 길에 과거 아닌 미래에 설정 될 수 있도록 하시겠습니까?

이 CREATE TABLE 문에서 구현하기가 너무 복잡? 그럼 내가 생각하면 나는 내가 제약 조건을 만들 수있는 부분이기 때문에 그것을 생략해야합니다.

, emp_dob DATE NOT NULL

    CREATE TABLE employee(emp_id NUMBER(4) PRIMARY KEY
, emp_name VARCHAR2(40) NOT NULL
, emp_address VARCHAR2(60) NOT NULL
, emp_tel NUMBER(11) NOT NULL
, CONSTRAINT emp_tel_length CHECK (LENGTH(emp_tel) BETWEEN 9 and 11)
, emp_dob DATE NOT NULL
, CONSTRAINT check_date_of_birth CHECK (emp_dob BETWEEN DATE '1950-01-01' AND sysdate))

해결법

  1. ==============================

    1.점검 제한 조건 결정해야합니다. 즉, 특정 행은 항상 제약 조건을 만족해야하며 항상 제약 조건을 만족하지 못하는해야합니다. 그러나 SYSDATE가 반환 된 값이 지속적으로 변화하기 때문에 본질적으로 비 결정적이다. 따라서, 당신은 전화가 SYSDATE하는 CHECK 제약 조건 또는 기타 사용자 정의 함수를 정의 할 수 없습니다.

    점검 제한 조건 결정해야합니다. 즉, 특정 행은 항상 제약 조건을 만족해야하며 항상 제약 조건을 만족하지 못하는해야합니다. 그러나 SYSDATE가 반환 된 값이 지속적으로 변화하기 때문에 본질적으로 비 결정적이다. 따라서, 당신은 전화가 SYSDATE하는 CHECK 제약 조건 또는 기타 사용자 정의 함수를 정의 할 수 없습니다.

    당신은 제한 조건 정의에 참조 SYSDATE하려고하면 오류가 발생합니다

    SQL> ed
    Wrote file afiedt.buf
    
      1  create table t(
      2      birth_date date check( birth_date between date '1900-01-01' and
      3                                                sysdate )
      4* )
    SQL> /
                                                  sysdate )
                                                  *
    ERROR at line 3:
    ORA-02436: date or system variable wrongly specified in CHECK constraint
    

    당신은 최소 및 최대 날짜가 모두 하드 코딩 있었던 CHECK 제약 조건을 만들 수 있지만 지속적으로 삭제하고 제약 조건을 다시해야 할 것 때문에 그것은 특히 실용적이지 않을 것입니다.

    SQL> ed
    Wrote file afiedt.buf
    
      1   create table t(
      2       birth_date date check( birth_date between date '1900-01-01' and
      3                                                 date '2011-12-08' )
      4*  )
    SQL> /
    
    Table created.
    

    요구 사항이 일종의을 적용 할 수있는 실제적인 방법은 테이블에 트리거를 작성하는 것입니다

    CREATE OR REPLACE TRIGGER check_birth_date
      BEFORE INSERT OR UPDATE ON employee
      FOR EACH ROW
    BEGIN
      IF( :new.emp_dob < date '1900-01-01' or 
          :new.emp_dob > sysdate )
      THEN
        RAISE_APPLICATION_ERROR( 
          -20001, 
          'EMployee date of birth must be later than Jan 1, 1900 and earlier than today' );
      END IF;
    END;
    
  2. ==============================

    2.또 다른 방법은 도메인에 내장 된 제약 조건, 도메인 생년월일을 생성하는 것입니다. 이것은 당신이 다른 테이블 정의에서 동일한 유형을 재사용 할 수 있습니다.

    또 다른 방법은 도메인에 내장 된 제약 조건, 도메인 생년월일을 생성하는 것입니다. 이것은 당신이 다른 테이블 정의에서 동일한 유형을 재사용 할 수 있습니다.

    CREATE DOMAIN birthdate AS date DEFAULT NULL
        CHECK (value >= '1900-01-01' AND value <= now())
        ;
    
    CREATE TABLE employee
        ( empno INTEGER NOT NULL PRIMARY KEY
        , dob birthdate NOT NULL
        ...
        );
    
  3. ==============================

    3.또 다른 해결 방법에 대한 어떤

    또 다른 해결 방법에 대한 어떤

    쓰기 열로 SYSDATE 및 검증을 위해 사용합니다. 이 열은 감사 열 수 있습니다 (예를 들어 작성 날짜)

    CREATE TABLE "AB_EMPLOYEE22"
    (
       "NAME"     VARCHAR2 ( 20 BYTE ),
       "AGE"      NUMBER,
       "SALARY"   NUMBER,
       "DOB"      DATE,
       "DOJ"      DATE DEFAULT SYSDATE
    );
    
    Table Created    
    
    ALTER TABLE "AB_EMPLOYEE22" ADD CONSTRAINT
    AGE_CHECK CHECK((ROUND((DOJ-DOB)/365)) = AGE) ENABLE;
    
    Table Altered
    
  4. ==============================

    4.당신은 내가 사용 DATE_JOINING입니다 DATE_OF_BIRTH과 PRESENT_DATE 즉있는 테이블을 만든 다음 DATE_JOINING 마이너스 DATE_OF_BIRTH을 뺀 연령 기본값을 사용합니다.

    당신은 내가 사용 DATE_JOINING입니다 DATE_OF_BIRTH과 PRESENT_DATE 즉있는 테이블을 만든 다음 DATE_JOINING 마이너스 DATE_OF_BIRTH을 뺀 연령 기본값을 사용합니다.

    마지막으로 AGE로 설정 CHECK 제약 내가 20을 설정하고 즉 귀하의 요구 사항 때보 다 크다.

    아래를 참조하십시오

    CREATE TABLE EMPLOYEE(
        NAME VARCHAR(20) NOT NULL,
        DOB DATE NOT NULL,
        DATE_JOINING DATE DEFAULT NOW(),
        AGE INTEGER DEFAULT TIMESTAMPDIFF(YEAR,DOB,DATE_JOINING) CHECK(AGE>20)
        );
    
    INSERT INTO EMPLOYEE(NAME,DOB) VALUES('NAYAK','1998-2-3');
    Query OK, 1 row affected, 1 warning (0.128 sec)
    
    SELECT * FROM EMPLOYEE;
    +-------+------------+--------------+------+
    | NAME  | DOB        | DATE_JOINING | AGE  |
    +-------+------------+--------------+------+
    | NAYAK | 1998-02-03 | 2019-10-15   |   21 |
    +-------+------------+--------------+------+
    1 row in set (0.001 sec)
    
    INSERT INTO EMPLOYEE(NAME,DOB) VALUES('NIRAJAN','2005-2-3');
    ERROR 4025 (23000): CONSTRAINT `EMPLOYEE.AGE` failed for `NAYAK`.`EMPLOYEE`
    
  5. ==============================

    5.직접 간격을 사용할 수 있습니다 :

    직접 간격을 사용할 수 있습니다 :

    ALTER TABLE "students"
      ADD CONSTRAINT "students_must_be_over_18" CHECK (
        CURRENT_TIMESTAMP - "date_of_birth" > INTERVAL '18 years'
      );
    
  6. from https://stackoverflow.com/questions/8424900/check-constraint-on-date-of-birth by cc-by-sa and MIT license