2013-07-20 2 views
1

학생 정보가 포함 된 STUDENTS 테이블이 있습니다. 각 학생은 CANDIDATE BIT 값에 따라 대학 투표 이벤트에서 CANDIDATE 일 수도 있고 아닐 수도 있습니다.테이블 정의의 참조 무결성 검사

VOTE 테이블을 갖고 싶지만, VOTES_FOR으로 삽입되는 학생이 실제로 CANDIDATE인지 확인하고 싶습니다. 보통 영어로 : 투표 대상자가 실제로 후보자인지 아닌지 확인하십시오.

이 제약 조건을 어떻게 확인할 수 있습니까? 저장 프로 시저 및 PL/SQL 또는 T-SQL이 아닌 간단한 일반 DDL 명령을 사용하여이 작업을 수행하려고합니다.

CREATE TABLE STUDENTS(
    ID INT NOT NULL UNIQUE AUTO_INCREMENT = 1, 
    FIRST_NAME NVARCHAR(20) NOT NULL , 
    LAST_NAME NVARCHAR(20) NOT NULL, 
    CANDIDATE BIT DEFAULT '0', 
    PRIMARY KEY(ID) 
);  
CREATE TABLE VOTE(
    STUDENT_ID references STUDENTS(ID), 
    VOTES_FOR references STUDENTS(ID), 
    PRIMARY KEY STUDENT_ID 
); 
+0

나는 귀하의 목표가 비 후보자에 대한 투표를 막는 것이라고 가정하고 있습니다. 맞습니까? 당신은 자신이 응용 프로그램에서 이것을 막지 못하도록 제한되어 있습니까? – ermagana

+0

네, 맞습니다. 응용 프로그램 자체가 아니라 테이블 정의 레벨을 갖고 싶습니다. –

+0

PL/SQL에 대한 언급으로 오라클을 사용하고있는 것 같아요? – ermagana

답변

2

"ID"와 "CANDIDATE"열 쌍에 UNIQUE 제약 조건을 선언하고 "VOTES"테이블에서 해당 쌍을 참조하십시오. "투표 (VOTES)"에서 CHECK 제약 조건을 사용하여 후보자에 대해서만 투표가 기록되도록하십시오.

CREATE TABLE STUDENTS(
    ID INTEGER PRIMARY KEY, 
    FIRST_NAME VARCHAR2(20) NOT NULL, 
    LAST_NAME VARCHAR2(20) NOT NULL, 
    CANDIDATE CHAR(1) DEFAULT 'f' NOT NULL 
     CHECK (CANDIDATE IN ('t', 'f')), 
    UNIQUE (ID, CANDIDATE) 
); 

CREATE TABLE VOTES(
    STUDENT_ID INTEGER PRIMARY KEY 
     REFERENCES STUDENTS (ID), 
    VOTES_FOR INTEGER NOT NULL, 
    CANDIDATE CHAR(1) DEFAULT 't' 
     CHECK (CANDIDATE = 't'), 
    FOREIGN KEY (VOTES_FOR, CANDIDATE) 
     REFERENCES STUDENTS (ID, CANDIDATE) 
); 

"IS_CANDIDATE"는 아마도 "후보"보다 나은 이름입니다. "CANDIDATE_ID"는 아마도 "VOTES_FOR"보다 더 나은 이름 일 것입니다.

+0

@ mike-sherrill-catcall이 흥미로 우며, 비트 필드 대 char (1)을 사용한 이유가 있습니까? 이것은 확실히이 문제를 해결합니다. 훌륭한 대답입니다. – ermagana

+1

a) 모든 dbms는 char (1)을 지원합니다. 대부분 * 비트 데이터 형식을 지원하지 않습니다. b) SQL : 2003 표준은 비트 유형을 삭제했습니다. c) Oracle은 CREATE TABLE 문에서 부울 데이터 유형을 지원하지 않습니다. –

0

SQL CHECK 제약 조건을 사용해 보았습니까?

http://www.w3schools.com/sql/sql_check.asp

당신은 당신이 원하는 수표를 제공하기 위해 복합 외부 키가 필요 것입니다.

+0

실제로 문제는 외래 키의 값을 확인하고 싶지 않다는 것입니다. 행의 '후보'의 값을 확인하고 싶습니다. 참조되고 있으며 혼돈 스럽습니다. 복합 외래 키가 어떻게 우리에게 도움이 될 수 있습니까? –

2

이 유형의 문제에 대한 DDL 솔루션을 찾으십시오.

나는 후보 테이블을 통합하는쪽으로 밀고 싶습니다. 내 추론은 다음 해 또는 그 이후에 후보자가 될 수있는 후보자 시작 시간 및 종료 시간과 같은 독특한 특성을 선언 할 수있게합니다.

또한이 후보자는 참조 할 수있는 ID를 제공합니다.

CREATE TABLE student { 
    id INTEGER PRIMARY KEY, 
    fname VARCHAR(20) NOT NULL, 
    lname VARCHAR(20) NOT NULL 
}; 

CREATE TABLE candidate { 
    id INTEGER PRIMARY KEY, 
    student_id INTEGER(11) NOT NULL, 
    start_year INTEGER(4) NOT NULL, 
    start_month INTEGER(2) NOT NULL, 
    start_day INTEGER(2) NOT NULL, 
    end_year INTEGER(4) NULL, 
    end_month INTEGER(2) NULL, 
    end_day INTEGER(2) NULL 
} 

CREATE TABLE vote { 
    student_id INTEGER(11) NOT NULL, 
    candidate_id INTEGER(11) NOT NULL 
}; 
+0

새 테이블을 만들고 그 테이블을 관리하는 것은 문제 자체이며, 일반적으로 가능한지 알고 싶습니다. –

+0

DDL 솔루션입니다. – wurde

+0

학생은 후보자가 아니며 DB가이를 인식해야한다고 주장하고 있습니다. – wurde

1

Oracle을 사용하고있는 상황 오라클 제약이 허용보다 조금 더 복잡 할 수 있지만 당신이 Ref Constraint 보길 원하는 데이터베이스가 여기에 exmample에게 Ref Constraint Example

을 있다면. Tony Andrews로 작성된이 기사는 원하는 결과를 얻기위한 독창적 인 해결 방법을 제공합니다.