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