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

时间:2012-01-21 20:13:23

标签: python sql

我想使用自动递增的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);

我使用此方法收到的错误消息是: 无法添加或更新子行:外键约束失败(dbtable2,CONSTRAINT table2_ibfk_1 FOREIGN KEY(ID)REFERENCES table1({{ 1}}))

2 个答案:

答案 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在哪里查找相关记录,因此它们是同一语句的一部分,不能用逗号分隔。