【问题标题】:incorrect integer value mySQL不正确的整数值 mySQL
【发布时间】:2020-12-09 20:28:20
【问题描述】:

我收到一个错误,我为 userID_fk 和目标使用了不正确的整数值。对于具有整数作为数据类型的值,如果将其更改为 text 或 varchar,则会出现错误,它将表明已创建站点并且 siteID 将增加,但不会包含其他数据。我希望用户输入他们的用户名,使其与其用户 ID 匹配,并使用 Tkinter 通过 python 插入 userID_fk。

下面是我的用户和网站表的结构

用户:

 CREATE TABLE `users` (
 `userID` int(255) NOT NULL AUTO_INCREMENT,
 `userName` varchar(255) CHARACTER SET latin1 COLLATE latin1_general_cs NOT NULL,
 `userPassword` varchar(225) CHARACTER SET latin1 COLLATE latin1_general_cs NOT NULL,
 `Name` varchar(255) NOT NULL,
 `phoneNum` text NOT NULL,
 `email` varchar(230) NOT NULL,
 `region` text NOT NULL,
 `accessLevel` int(10) NOT NULL,
 PRIMARY KEY (`userID`)
) ENGINE=InnoDB AUTO_INCREMENT=10002 DEFAULT CHARSET=utf8 ROW_FORMAT=COMPACT

网站:

CREATE TABLE `sites` (
 `siteID` int(225) NOT NULL AUTO_INCREMENT,
 `siteName` text CHARACTER SET latin1 COLLATE latin1_general_cs NOT NULL,
 `userID_fk` int(255) NOT NULL,
 `region` text NOT NULL,
 `risklevel` text NOT NULL,
 `siteType` text NOT NULL,
 `target` int(225) NOT NULL,
 PRIMARY KEY (`siteID`),
 KEY `userID_fk` (`userID_fk`),
 CONSTRAINT `sites_ibfk_1` FOREIGN KEY (`userID_fk`) REFERENCES `users` (`userID`) ON UPDATE CASCADE
) ENGINE=InnoDB DEFAULT CHARSET=utf8 ROW_FORMAT=COMPACT

将站点插入站点表的 Python 代码:

def register_site():
    sitename_info = sitename2.get()
    username2_info = username2.get()
    region_info = region.get()
    risklevel_info = risklevel.get()
    sitetype_info = sitetype.get()
    targetpercent_info = targetpercent.get()
    # Sql code for writing the data that was written in the regsitering page. 
    cursor = cnn.cursor()
    sitequery = "INSERT INTO `sites`(`siteID`, `siteName`, `userID_fk`, `region`, `risklevel`, `siteType`, `target`) VALUES (NULL,%s,%s,%s,%s,%s,%s)"
    sitequery_vals = (sitename_info, username2_info, region_info, risklevel_info, sitetype_info, targetpercent_info)
    cursor.execute(sitequery, sitequery_vals)
    cnn.commit()
    cursor.close()
    cnn.close()
    # removes the values in the entrys once the user selects that the registration was successful
    sitename2_entry.delete(0, END)
    region_entry.delete(0, END)
    risklevel_entry.delete(0, END)
    sitetype_entry.delete(0, END)
    targetpercent_entry.delete(0, END)
    Label(screen10, text = "Site Created", fg = "green", font = ("calibri", 11)).pack()

【问题讨论】:

  • 插入时不要包含列siteID。
  • 如果我不包含 siteID,我仍然会收到相同的错误...我已经声明 siteID 的值为 null 是否无关紧要?
  • 为什么是int(255),int(225)select version(); 显示什么?
  • 真的不知道我对此很陌生,我正在为一个课程项目做这个。我试图保持数据类型与其他表中的数据相同,但即使不将它们用作整数,我仍然会收到错误。
  • siteID 是自动递增的,因此不应包含在insert... 中。您试图插入整数字段userID_fkusername2_info = username2.get() 中的username2_info 的值是多少?我怀疑它不是数字,而是顾名思义的字符串。

标签: python mysql tkinter


【解决方案1】:

如果username2_infouserName,则需要从users 表中获取userID

sitequery = ("INSERT INTO `sites` (`siteName`, `userID_fk`, `region`, `risklevel`, `siteType`, `target`) "
             "SELECT %s, `userID`, %s, %s, %s, %s FROM `users` WHERE `userName` = %s")
sitequery_vals = (sitename_info, region_info, risklevel_info, sitetype_info, targetpercent_info, username2_info)
cursor.execute(sitequery, sitequery_vals)
cnn.commit()

【讨论】:

  • 我收到一条消息,说网站已创建,但没有任何内容插入数据库中..
  • 可能是users表中不存在用户名。这对我来说可以。添加print(cursor.rowcount) 以显示在cursor.execute(...) 之后插入的记录数。
  • 它打印出没有插入记录,你的意思是用户表中可能没有用户名..?我已经看了一下,假设这意味着我在表中没有任何内容,我在那里有用户。我已经有一段与此类似的代码,它通过 python 将用户插入数据库并且工作正常,所以我不确定为什么这段代码没有。
  • 表示users表中没有你输入username2的用户名的记录。
  • 我刚刚在用户表中使用用户名 1 创建了一个用户,并将 1 放入 username2 中,但仍然没有创建任何内容。如果我的 username2 是另一个函数中的全局变量并且它只是不提取我输入的任何数据,这是否重要。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2023-04-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-11-04
  • 2018-02-06
相关资源
最近更新 更多