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의 조합으로 한 레코드 만 허용해야합니다). 그가 다시 시도하면 오류 메시지가 나타납니다.
그래서 고유 기본 키만 삽입되는 'INSERT'를 변경 하시겠습니까? 어떤 종류의 복제본을 가지고 있으며, 일부 샘플 데이터와 예상 결과를 보여줍니다 (그리고 C# 코드를 쿼리에서 제거합니다. 그렇지 않으면 복사 & 붙여 넣기가 불가능합니다). –