2012-04-27 4 views
1

저는 학생 데이터 (이름과 클래스)를 한 번에 하나씩 테이블에 추가하는 python 스크립트를 작성했습니다. 테이블은 기본 키 열, 학생 이름 열 및 각 클래스의 열이 있도록 구조화되어 있습니다. 스크립트는 추가중인 클래스가 이미 열에 있는지 확인하고 그렇지 않으면 클래스를 만듭니다. 그런 다음 현재 학생의 해당 열 아래에 '사실'이라고 씁니다.일부 MySQL 쿼리가 적용되지 않습니다.

여기 내 문제가 있습니다. 로그 파일에서 모든 단일 쿼리가 데이터베이스로 올바르게 보내지 만 일부는 테이블에 표시되지 않는 것을 볼 수 있습니다. 다음 검색어를 실행할 때

CREATE TABLE Students (idStudents INT NOT NULL, Name VARCHAR(255) NOT NULL, PRIMARY KEY (idStudents)) ENGINE = InnoDB DEFAULT CHARACTER SET = utf8 
SET NAMES 'utf8' 
INSERT INTO Students (idStudents, Name) VALUES ('1', 'Bror Tao Sjørslev Bojlen') 
SELECT column_name FROM information_schema.columns WHERE table_name='Students' 
ALTER TABLE Students ADD 3ubmSL5 VARCHAR(20) 
UPDATE Students SET 3ubmSL5='true' WHERE idStudents='1' 
ALTER TABLE Students ADD 3uchSL3 VARCHAR(20) 
UPDATE Students SET 3uchSL3='true' WHERE idStudents='1' 
ALTER TABLE Students ADD 3udaBH3 VARCHAR(20) 
UPDATE Students SET 3udaBH3='true' WHERE idStudents='1' 
ALTER TABLE Students ADD 3uenA1H1 VARCHAR(20) 
UPDATE Students SET 3uenA1H1='true' WHERE idStudents='1' 
ALTER TABLE Students ADD 3umaHL4 VARCHAR(20) 
UPDATE Students SET 3umaHL4='true' WHERE idStudents='1' 
ALTER TABLE Students ADD 3uphH2 VARCHAR(20) 
UPDATE Students SET 3uphH2='true' WHERE idStudents='1' 
ALTER TABLE Students ADD 3uth1 VARCHAR(20) 
UPDATE Students SET 3uth1='true' WHERE idStudents='1' 

표는 this입니다. 이다

,

UPDATE Students SET 3uth1='true' WHERE idStudents='1' 

가 통과하지 않는 최종 쿼리.

나는 이것이 이치에 맞기를 바라고 누군가가이 문제에 관해 밝힐 수 있기를 바랬다. 그것이 나를 미치게했다.

답변

1

마지막 문장이 롤백되고있는 것으로 생각됩니다. 귀하의 클라이언트가 트랜잭션에서 암시 적으로 명령문을 래핑하고 있다고 생각합니다. Navicat가 다른 진술을 동반하지 않는 한 명시 적으로 커밋되지 않은 삽입이나 업데이트가 포함 된 트랜잭션을 구체적으로 보았습니다. 그것은 이상한 행동이지만 추적을 통해 그것을 지켜 봤습니다.

제쳐두고, 테이블 디자인은 다소 틀립니다. 학생과 수업은 별개의 개체이며 동일한 테이블에 저장하면 안됩니다. 여기에 적어도 세 가지 다른 테이블을 결합하고 있습니다. 이것은 잘 확장되지 않습니다.

편집 :

사실

, 내가 여기에이 문제를 포함 게시 된 첫 번째 질문 : Unable to insert record from stored procedure called from web service

난 그냥 그 기억. :)

+0

각 학생 다음에 COMMIT 쿼리가 추가되어 문제가 해결되었습니다 - 감사합니다! 나는 테이블 구조에 대한 언급에 감사 드리며, 이것이 프로그래밍과 데이터베이스에 대한 첫 번째 진출이므로 비판이 도움이된다. 어쩌면 100 열을 가진 매우 작은 프로젝트이므로 확장성에 문제는 없습니다. 그러나 올바르게 수행하는 습관을 가지려면 더 나은 테이블 디자인을 찾아야합니다! –

+0

학생들을위한 테이블, 수업을위한 테이블, 그리고 등록을위한 테이블을 시험해보십시오. 등록 테이블에는 StudentID 열 W ClassID 열만있을 수 있습니다. 학생 1이 클래스 3ubmSL5에 등록하면 INSERT INTO Enrollments (idStudent, idClass) VALUES (1, '3ubmSL5'); ' – mdoyle

+0

이됩니다. 고맙습니다. 처음 엔 비슷한 것을 고려하고 있었지만 Enrollments 테이블이 같은 클래스의 학생들에게 각각의 클래스에 대해 행을 써야하기 때문에 반대했습니다. 한 학생이 여러 줄을 가지고있는 것이 이상하게 느껴지지만 합리적이라고 생각합니다. –

0

데이터베이스 업데이트를 커밋하는 데 문제가있을 수 있습니까? 명시 적 COMMIT가 있거나 새 쿼리를 만들 때 이전 쿼리에서 변경 사항을 커밋 한 두 개의 데이터베이스가 있다는 것을 상기하는 것 같습니다.이 경우 최종 업데이트는 커밋되지 않습니다. 스크립트가 종료되고 변경 사항이 롤백됩니다.

+0

네 말이 맞아, 나는 각 학생 다음에 명시적인'COMMIT' 질의를 추가해야만했다. Strange는 로컬에 호스트 된 완전히 기본 데이터베이스이기 때문에 이상합니다. 고맙습니다! –

관련 문제