2012-04-27 7 views
1

私は、生徒データ(名前とクラス)を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が別のステートメントを伴わない限り、明示的にコミットされていない挿入または更新を含むトランザクションをロールバックしていることがわかりました。それは奇妙な行動ですが、私はそれを痕跡を通して見てきました。

あなたのテーブルのデザインはかなり独創的です。学生とクラスは異なるエンティティであり、同じテーブルに格納しないでください。ここでは少なくとも3つの異なるテーブルを結合しています。これはうまく拡張できません。

EDIT:実際には

、私はここに掲載最初の質問は、この問題を関与: Unable to insert record from stored procedure called from web service

私はちょうどそれを思い出しました。 :)

+0

各学生の後に 'COMMIT'クエリを追加し、問題を修正しました - ありがとう!私はテーブル構造についてのコメントを感謝します。これはプログラミングとデータベースへの私の最初の挑戦ですので、どんな批判も役立ちます。多分100行の非常に小さなプロジェクトなのでスケーラビリティは問題ではありませんが、適切な習慣を身に付けるために、より良いテーブルデザインを見つけるでしょう! –

+0

学生のためのテーブル、クラスのテーブル、そして登録のためのテーブルを試してみてください。 enrollmentsテーブルには、StudentID列とClassID列のみが含まれている場合があります。 Student 1がクラス3ubmSL5に登録すると、INSERT INTO Enrollments(idStudent、idClass)VALUES(1、 '3ubmSL5'); ' – mdoyle

+0

になります。ありがとうございます。最初は似たようなものを検討していましたが、Enrollmentsテーブルでは同じクラスの学生がそれぞれのクラスに1つの行を持つことになります。一人の生徒が複数の行を持つのは奇妙だと感じますが、合理的に聞こえます。 –

0

データベースへの更新をコミットすると問題が発生する可能性がありますか?私が使用したデータベースのいくつかは、明示的なCOMMITがあるとき、または新しいクエリを作成するときに、以前のクエリからの変更をコミットしたことを思い出しているようです。この場合、最終更新はコミットされませんスクリプトは終了し、変更はロールバックされます。

+0

あなたが正しいです、私は各学生の後に明示的な 'COMMIT'クエリを追加しなければなりませんでした。不思議なことに、それはローカルにホストされた完全にデフォルトのデータベースだからです。ありがとうございました! –

関連する問題