1

我编写了一个 python 脚本,一次将学生数据(姓名和班级)添加到一个表中。该表的结构是有一个主键列、一个学生姓名列,然后是每个班级的一个列。该脚本检查它添加的类是否已作为列存在,如果不存在,则创建它。然后它在当前学生的该列下写入“true”。

这是我的问题:从日志文件中,我可以看到每个查询都正确发送到数据库,但有些查询没有显示在表中。当我运行这些查询时:

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'

桌子看起来像这样

也就是最后的查询

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

不通过。

我希望这是有道理的,有人可以对这个问题有所了解——这让我发疯。

4

2 回答 2

1

我怀疑最终声明正在回滚。我猜您的客户正在将语句隐式包装在事务中。我特别看到 Navicat 回滚包含未明确提交的插入或更新的事务,除非它们伴随着另一个语句。这是奇怪的行为,但我已经通过跟踪观察了它。

顺便说一句,你的桌子设计是相当非传统的。学生和班级是不同的实体,不应存储在同一个表中。您在这里至少组合了三个不同的表;这不会很好地扩展。

编辑:

事实上,我在这里发布的第一个问题涉及到这个问题: Unable to insert record from stored procedure called from web service

我只是想起来了。:)

于 2012-04-27T18:48:54.563 回答
0

提交数据库更新会不会有问题?我似乎记得我使用过的几个数据库在有明确的 COMMIT 或进行新查询时已经提交了上一个查询的更改,因此在这种情况下,最终更新不会在脚本终止,并且更改将被回滚。

于 2012-04-27T18:43:34.210 回答