2013-08-13 4 views
3

SQL Server를 처음 사용합니다. Access에서 DB를 만들고 거기에 내 관계를 정의했습니다. 이 후 SQL Server 가져 오기 및 내보내기 데이터 도구를 사용하여 DB를 변환하고 SQL Server에서 사용했습니다.SQL Server 테이블에서 중복을 방지하는 방법

Student   Course    Course-Module Module   
-------------  -------------  ------------- ------------- 
TagID (PK)   CourseID (PK)  CourseID (FK) ModuleID (PK) 
StudentName  CourseName   ModuleID (FK) ModuleName 
CourseID                

Module-Session  Session   Atendance 
--------------  --------------  -------------- 
ModuleID (FK)  SessionID (PK)  TagID  (FK) 
SessionID (FK)  SessionName  SessionID (FK)  
        SessionDate  ScanningTime 
        SessionTimeStart 
        SessionTimeEnd 

나는 삽입의 시간과 함께 Attendance 테이블에 결과를 삽입 주어진 TagID에 대한 현재 SessionID를 찾을 수 쿼리를 개발 한 다음과 같이 내 테이블 구조입니다.

내 쿼리는 쿼리를 실행하고, 예상되는 결과를 생산하고 Attendance 테이블에 삽입 (VS C#을 구문)

string query = @"INSERT INTO Attendance " + 
       "SELECT s.TagID, se.SessionID, " + 
       " @todaysDate " + 
       " AS ScanningTime " + 
       " FROM (((Student s " + 
       " LEFT JOIN [CourseID-ModuleID] cm ON s.CourseID = cm.CourseID) " + 
       " LEFT JOIN [ModuleID-SessionID] ms ON cm.ModuleID = ms.ModuleID) " + 
       " LEFT JOIN [Session] se ON ms.SessionID = se.SessionID) " + 
       " WHERE s.TagID = @tagNo " + 
       " AND se.SessionDate = cast(getdate() as date) " + 
       " AND se.SessionTimeStart <= @Plus30Min " + 
       " AND se.SessionTimeEnd >= @Plus30Min "; 

입니다.

내 문제는 내가 필드 TagID을하고 싶습니다과 Attendance 테이블의 SessionID가 고유해야한다는 것입니다, 즉 내가 지금 가능한 한 한 학생이 아닌 여러 번, 한 번만 특정 세션에 등록합니다.

편집 :

내 문제의 예. 학생 태그를 검색하고 결과는 출석 테이블에 배치됩니다 : 몇 초 후

Attendance 
-------------------------------------- 
TagID  SessionID  ScanningTime 
4820427  Test1 2013-08-13 15:10:02.590 

, 학생이 다시 스캔을 시도, 그 결과는 이것은

Attendance 
-------------------------------------- 
TagID  SessionID  ScanningTime 
4820427  Test1 2013-08-13 15:10:02.590 
4820427  Test1 2013-08-13 15:10:09.103 

원하는 새 레코드로 추가 I 피하고 싶다. 한 학생에게 한 번만 스캔하도록하고 싶습니다. (따라서 4820427과 Test1의 조합으로 한 레코드 만 허용해야합니다). 그가 다시 시도하면 오류 메시지가 나타납니다.

+1

그래서 고유 기본 키만 삽입되는 'INSERT'를 변경 하시겠습니까? 어떤 종류의 복제본을 가지고 있으며, 일부 샘플 데이터와 예상 결과를 보여줍니다 (그리고 C# 코드를 쿼리에서 제거합니다. 그렇지 않으면 복사 & 붙여 넣기가 불가능합니다). –

답변

1

정확하게 정확히 UNIQUE constraint ...을 작성하십시오.

ALTER TABLE Attendance ADD CONSTRAINT UNIQUE NONCLUSTERED 
(
    TagID, 
    SessionID 
) 
+0

정교하게 주시겠습니까? 나는 SQL에 완전히 익숙하지 않다. – jaspernorth

+0

이 같은 솔기가 도움이 될 것이다. 두 개의 collumn에 대한 고유 제한 조건을 함께 만들 수 있습니까? – jaspernorth

+0

정말 고마워요! – jaspernorth

2

TagID 및 SessionID를 복합 키인 기본 키로 만듭니다.

open design view, 
choose the two fk keys. 
and make as primarykey. 
+0

그러나 OP는 두 가지 모두에 대해 'PK'로 표시되어 있으므로 기본 키라고 가정합니다. –

+0

출석 표에는 기본 외양이 아닌 외래 키가 2 개 있습니다. – jaspernorth

+0

출석 표 – jaspernorth

관련 문제