Python MySQLdb:键1的重复条目“2147483647”

时间:2012-07-11 06:00:09

标签: python mysql mysql-python duplicates

我在Python中运行程序时收到此错误。 这是我的数据库表:

Field           Type            Collation       Null        Key     Default     
articleCode   varchar(25)    latin1_swedish_ci   NO         UNI                                                
dateReceived   datetime            NULL          NO         MUL     0000-00-00 00:00:00                  
s100RSD        datetime            NULL          YES                0000-00-00 00:00:00        
remarks        longtext      latin1_swedish_ci   YES                        

为了简化我的程序问题,我将在这里找出导致错误的程序部分:

import MySQLdb

def main():
    dateReceived = '2011-10-07 01:06:30'
    articleCode = 'name'
    s100rsd = '2011-10-07 01:06:30'
    remark_text = 'This is a remark'
    db = MySQLdb.connect('server', 'user', 'passwd', 'table_name', port)
    cur = db.cursor()
    db_query = cur.execute("INSERT INTO tblS100CurrentListing (articleCode, dateReceived, s100RSD, remarks) VALUES ('articleCode', 'dateReceived', 's100rsd', 'remark_text')")
    cur.close()
    db.close()

if __name__ == '__main__':
    main()

这是我得到的错误:_mysql_exceptions.IntegrityError:(1062,“密钥1的重复条目'2147483647”)

感谢您的帮助!

4 个答案:

答案 0 :(得分:2)

您似乎将常量插入数据库,而不是实际值。相反,尝试类似的东西;

db_query = cur.execute("INSERT INTO tblS100CurrentListing " +
    "(articleCode, dateReceived, s100RSD, remarks) VALUES (%s, %s, %s, %s)", 
    (articleCode, dateReceived, s100rsd, remark_text))

答案 1 :(得分:2)

这是因为Key的限制。如果是INTEGER,则2147483647是限制。您可以选择BIGINT或比INTEGER更大的东西。 2147483647之后的所有记录都将尝试写入值2147483647.因此,这就是您遇到此问题的原因。用BIGINT / LARGEINT或类似的东西改变它。

希望它有所帮助。

答案 2 :(得分:1)

字段上的唯一键" articleCode" 阻止MySQL在此列中具有两条具有相同内容的记录。好像你已经在第一个程序运行中插入了一个。

使用 articleCode =' name' 删除以前插入的记录,或删除 articleCode 字段上的UNIQUE KEY或尝试插入不同的articleCode值。

希望这有帮助!

答案 3 :(得分:0)

按照其他答案中的描述更正代码后,您应该修改表格以重置其auto_increment计数器。

ALTER TABLE tblS100CurrentListing auto_increment=1

应将计数器重置为可能的最低值。

需要从表中删除或修复错误值;否则改变不会有任何影响。

此外,是否真的需要插入一个设置为auto_increment的字段?或者这是恢复过程的一部分?否则,这两件事是多余的:要么自动获取数据,要么插入数据。两者都可以(如图所示)导致冲突。