我想使用自动递增的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)
还有一件事 - 在FOREIGN KEY(ID)和REFERENCES之间加一个逗号(Table2)会产生错误。 ??
编辑:我认为我的问题不明确。我想要的是制作'ID' 在表2中
`ID` integer NOT NULL,
FOREIGN KEY (ID)
参考
`ID` integer NOT NULL AUTO_INCREMENT,
PRIMARY KEY (`ID`)
表1中的
编辑: LAST_INSERT_ID()适用于单行插入。 MySQL documentation描述了如何使用多行。 Table2确实有多行。 UPDATE table2 SET ID = LAST_INSERT_ID(ID + 1);
我使用此方法收到的错误消息是:
无法添加或更新子行:外键约束失败(db
。table2
,CONSTRAINT table2_ibfk_1
FOREIGN KEY(ID
)REFERENCES table1
({{ 1}}))
答案 0 :(得分:1)
在查询2中,如果您有1,则必须在table1中插入其中一个ID值。这就是FK的含义,如果你没有插入引用表中存在的值,则抛出错误。
答案 1 :(得分:0)
问题1)MySQL提供LAST_INERT_ID()。对于单行操作,这将返回最后生成的自动增量数。对于多行插入,您必须跟踪插入的行数,因为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)REFERENCES告诉FOREIGN KEY在哪里查找相关记录,因此它们是同一语句的一部分,不能用逗号分隔。