Python 使用自动增量变量作为外键-获取外键约束错误

Python 使用自动增量变量作为外键-获取外键约束错误,python,sql,Python,Sql,我想使用一个自动递增的SQL变量作为外键。代码是用Python/SQL编写的(正确的说法是什么?) 但是,除非输入实际数字,否则会出现外键约束错误 我读过多篇关于这些错误的帖子,并试图使用这些信息 这是我的两张桌子。表1是顶部,表2是底部。ID是外键。 为了避免出错,我在代码中加入了数字1 +----+------+-------+ | id | name | class | +----+------+-------+ | 1 | ONE | TWO | | 2 | ONE | TW

我想使用一个自动递增的SQL变量作为外键。代码是用Python/SQL编写的(正确的说法是什么?) 但是,除非输入实际数字,否则会出现外键约束错误

我读过多篇关于这些错误的帖子,并试图使用这些信息

这是我的两张桌子。表1是顶部,表2是底部。ID是外键。 为了避免出错,我在代码中加入了数字1

+----+------+-------+
| id | name | class |
+----+------+-------+
|  1 | ONE  | TWO   |
|  2 | ONE  | TWO   |
|  3 | ONE  | TWO   |
|  4 | ONE  | TWO   |
+----+------+-------+

mysql> select * from table2;

+-----+------+-------+----+
| par | name | class | ID |
+-----+------+-------+----+
|   1 | SSS  | CAR   |  1 |
|   2 | SSS  | CAR   |  1 |
+-----+------+-------+----+
这是代码

sql= """CREATE TABLE IF NOT EXISTS table1 (
      `ID` integer NOT NULL AUTO_INCREMENT,
  `name` varchar(30) default NULL,
  `class` varchar(20) default NULL,
       PRIMARY KEY  (`ID`)
       )"""
cursor.execute(sql)

sql2 = """CREATE TABLE IF NOT EXISTS table2 (
  `par` integer NOT NULL AUTO_INCREMENT,
  `name` varchar(30) default NULL,
  `class` varchar(20) default NULL,
  `ID` integer NOT NULL,
  FOREIGN KEY (ID) REFERENCES table1 (ID),
  PRIMARY KEY (par)
  )"""          
cursor.execute(sql2)        

query = "INSERT INTO table1 (name, class) VALUES('ONE','TWO')"
cursor.execute(query)

query2 = "INSERT INTO table2 (name, class,ID) VALUES('SSS','CAR',1)"
cursor.execute(query2)
还有一件事——在外键(ID)和引用之间加一个逗号(表2)会出错

编辑:我想我的问题不清楚。我想做的是“ID” 在表2中

`ID` integer NOT NULL,
      FOREIGN KEY (ID)
参考文献

    `ID` integer NOT NULL AUTO_INCREMENT,    
     PRIMARY KEY  (`ID`)
在表1中

编辑: LAST_INSERT_ID()适用于单行插入。 描述如何对多行使用。 表2确实有多行。 更新表2集合ID=上次插入ID(ID+1)

我使用此方法收到的错误消息是:
无法添加或更新子行:在查询2中,外键约束失败(
db
table2
,约束
table2\u ibfk\u 1
外键(
ID
)引用
table1
ID

,在查询2中,如果有1,则必须在表1中插入ID的一个值。这就是FK的意思,如果没有插入引用表中存在的值,就会抛出一个错误。

问题1)MySQL提供。对于单行操作,这将返回最后生成的自动递增编号。对于多行插入,您必须跟踪插入的行数,因为LAST_INSERT_ID()返回为操作生成的第一个数字

以下是一对一的示例:

query = "INSERT INTO table1 (name, class) VALUES('ONE','TWO')"
cursor.execute(query)

query2 = "INSERT INTO table2 (name, class,ID) VALUES('SSS','CAR',LAST_INSERT_ID())"
cursor.execute(query2)
下面是一个一对多的示例:

#Insert the parent record
query = "INSERT INTO table1 (name, class) VALUES('ONE','TWO')"
cursor.execute(query)

#get the autoincrement id
cursor.execute('select LAST_INSERT_ID()')
parentId = cursor.fetchone()[0]

#Assuming you have several child records as a list of lists
childVals = [['SSS','CAR'],['FOO','BAR']]

#define the template child insert SQL using parameter substitution
# many dbapi modules use ? as the parameter placeholder, yours may use %s, etc.
query2 = "INSERT INTO table2 (name, class,ID) VALUES(?,?,?)"

#insert the child records with the parent id
for vals in childVals:
    #pass in the child record values with the parent id
    cursor.execute(query2, vals + [id])

问题2)引用告诉外键在哪里查找相关记录,因此它们是同一语句的一部分,不能用逗号分隔。

那么您的问题是什么?哪里有错误?在query2=…,行中,如果我没有在那里输入“1”,我会得到错误。我想引用表1中自动递增的ID。所以我想知道我应该用什么来代替1以使外键工作,我想知道你是如何格式化我的帖子的too@Tom问题下面有一个编辑按钮。有关更多信息,请参见。是的,这就是为什么我在那里放了1。但是我如何使1自动递增,就像它引用的变量一样?正如另一个响应所回答的,您可以使用LAST_INSERT_ID。但是您不应该使它自动递增。如果总是将1插入1,则表示它们是相同的实体,并且应该在同一个表中。如果没有,您应该控制插入内容,因为您可能希望在其中一个表中插入记录,而在另一个表中不插入记录。我看不出如何使多行插入有效。我得到外键约束错误我添加了一个一对多的例子来插入多个子记录。如果要添加多个父记录,我建议首先遍历父insert语句。不是最有效的,但它是直接的。如果有insert语句一次生成多行,游标通常会报告受影响的行数,
cursor.rowcount
。您可以使用此行数来增加最后一个_INSERT_ID()响应。非常好的解释@tharen,非常感谢您花时间写出来。