Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/338.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 需要自动增加值,但为什么?_Python_Mysql - Fatal编程技术网

Python 需要自动增加值,但为什么?

Python 需要自动增加值,但为什么?,python,mysql,Python,Mysql,我正在尝试使用python将一些数据插入MySQL表。根据我的理解,当您将数据插入到具有自动递增列的表中时,不需要给出所述列的值。但是,我遇到了一个问题,我没有足够的值来插入数据。我做错了什么?我看过这个网站,w3schools,MySQL文档,看起来我做的一切都是对的。我收到错误:mysql.connector.errors.DataError:1136(21S01):列计数与第1行的值计数不匹配 ... HAND_HISTORY_DB_TABLES['Hands'] = ( &quo

我正在尝试使用python将一些数据插入MySQL表。根据我的理解,当您将数据插入到具有自动递增列的表中时,不需要给出所述列的值。但是,我遇到了一个问题,我没有足够的值来插入数据。我做错了什么?我看过这个网站,w3schools,MySQL文档,看起来我做的一切都是对的。我收到错误:
mysql.connector.errors.DataError:1136(21S01):列计数与第1行的值计数不匹配

...
HAND_HISTORY_DB_TABLES['Hands'] = (
    "CREATE TABLE `Hands` ("
    "   `HandID` int NOT NULL AUTO_INCREMENT PRIMARY KEY,"
    "   `HandNumber` int UNIQUE,"
    "   `HandDate` date NOT NULL,"
    "   `HandResults` float"
    ") ENGINE=InnoDB")
...
            hand_insert = "INSERT INTO Hands "\
                          "SELECT %s, %s, %s " \
                          "FROM Hands " \
                          "WHERE NOT EXISTS " \
                          "(SELECT NULL, HandNumber, HandDate, HandResults " \
                          "FROM Hands " \
                          "WHERE HandNumber = %s AND HandDate = %s AND HandResults = %s)"
            cursor.execute(hand_insert, (self.hand_number, self.date, self.result,
                                         self.hand_number, self.date, self.result))
...

将原始问题还原为下面的答案解决了问题。

注释中建议的解决方案是显式写入目标表的列名。因此:

...
HAND_HISTORY_DB_TABLES['Hands'] = (
    "CREATE TABLE `Hands` ("
    "   `HandID` int NOT NULL AUTO_INCREMENT PRIMARY KEY,"
    "   `HandNumber` int UNIQUE,"
    "   `HandDate` date NOT NULL,"
    "   `HandResults` float"
    ") ENGINE=InnoDB")
...
            hand_insert = "INSERT INTO Hands (HandNumber, HandDate, HandResults) "\
                          "SELECT %s, %s, %s " \
                          "FROM Hands " \
                          "WHERE NOT EXISTS " \
                          "(SELECT NULL, HandNumber, HandDate, HandResults " \
                          "FROM Hands " \
                          "WHERE HandNumber = %s AND HandDate = %s AND HandResults = %s)"
            cursor.execute(hand_insert, (self.hand_number, self.date, self.result,
                                         self.hand_number, self.date, self.result))
...

上一次尝试失败,因为
Hands
表有4列
HandID、HandNumber、HandDate、HandResults
。用
插入手选择…
,您直接告诉查询插入表中的所有4列
Hands
,但是在
SELECT..
语句之后,您在
insert
中选择的字段只有3个。

指定要用insert子句填充的显式列:
insert into Hands(HandNumber、HandDate、HandResults)…
如果不这样做,查询将对所有列都有期望。或者,让插入保持原样,您可以使用select:
select NULL、HandNumber、HandDate、HandResults…
What@PaulT添加NULL。另外,您的
SELECT
似乎缺少了一个
FROM
子句……尝试了您的两个建议后,我仍然收到相同的错误或错误,声称我没有使用足够的参数。Nick说,第一个SELECT缺少一个
FROM
子句。。。如果您没有为INSERT指定列名列表,是否有其他表要检查数据不存在的位置?“。。。值或插入。。。选择,表中每列的值都必须由值列表提供,'-在mysql中,您也可以通过提供值覆盖自动增量