[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.점검 제한 조건 결정해야합니다. 즉, 특정 행은 항상 제약 조건을 만족해야하며 항상 제약 조건을 만족하지 못하는해야합니다. 그러나 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.또 다른 방법은 도메인에 내장 된 제약 조건, 도메인 생년월일을 생성하는 것입니다. 이것은 당신이 다른 테이블 정의에서 동일한 유형을 재사용 할 수 있습니다.
또 다른 방법은 도메인에 내장 된 제약 조건, 도메인 생년월일을 생성하는 것입니다. 이것은 당신이 다른 테이블 정의에서 동일한 유형을 재사용 할 수 있습니다.
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.또 다른 해결 방법에 대한 어떤
또 다른 해결 방법에 대한 어떤
쓰기 열로 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.당신은 내가 사용 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.직접 간격을 사용할 수 있습니다 :
직접 간격을 사용할 수 있습니다 :
ALTER TABLE "students" ADD CONSTRAINT "students_must_be_over_18" CHECK ( CURRENT_TIMESTAMP - "date_of_birth" > INTERVAL '18 years' );
from https://stackoverflow.com/questions/8424900/check-constraint-on-date-of-birth by cc-by-sa and MIT license
'SQL' 카테고리의 다른 글
[SQL] 필드에 외부 키를 리팩토링 (0) | 2020.07.17 |
---|---|
[SQL] TO_CHAR () 출력에서 빈 패딩을 제거 (0) | 2020.07.17 |
[SQL] MySQL은 오류 1093 주위 방법 (0) | 2020.07.17 |
[SQL] SQL Server의 글로벌 임시 테이블 (0) | 2020.07.17 |
[SQL] 어떻게 특정 노드에 그 리드를 SQL에서 계층 구조의 경로를 생성 할 수 있습니까? (0) | 2020.07.17 |