MySQL python外键无法正常运行

时间:2014-08-01 15:44:31

标签: python mysql sql

我正在尝试将一个外键添加到一个引用另一个表的表中,但每当我运行该程序时,表中的字段显示NONE的外键。代码如下

        cur.execute("CREATE TABLE IF NOT EXISTS Basic(pnid INT PRIMARY KEY AUTO_INCREMENT,Arena VARCHAR(25), CreateDate TIMESTAMP DEFAULT CURRENT_TIMESTAMP)")
        cur.execute("CREATE TABLE Units(pnid INT, bid INT PRIMARY KEY AUTO_INCREMENT, SerialNumber VARCHAR(25), BuildNumber VARCHAR(25), CurrentDate TIMESTAMP DEFAULT CURRENT_TIMESTAMP)")

         cur.execute("INSERT INTO Basic(Arena) VALUES(%s)", arenanumber)
         cur.execute("ALTER TABLE Units ADD FOREIGN KEY(pnid) REFERENCES Basic(pnid);")
         cur.execute("INSERT INTO Units(SerialNumber) VALUES(%s)", serialnumber)
         cur.execute("SELECT * FROM Units")
         print cur.fetchall()

这会在pnid colunm中返回None

1 个答案:

答案 0 :(得分:1)

在Units表中插入行时,需要指定pnid。在您的示例中,您有一个新表,只有一行,但如果您在Basic表中有100个条目,则数据库不知道Basic表中要将该单元与哪个条目相关联。在您的示例中,您希望将Unit放在您刚刚在Basic中创建的条目上,您应该能够使用LAST_INSERT_ID()来标识id,所以我认为它变成如下所示:

cur.execute("CREATE TABLE IF NOT EXISTS Basic(pnid INT PRIMARY KEY AUTO_INCREMENT,Arena VARCHAR(25), CreateDate TIMESTAMP DEFAULT CURRENT_TIMESTAMP)")
cur.execute("CREATE TABLE Units(pnid INT, bid INT PRIMARY KEY AUTO_INCREMENT, SerialNumber VARCHAR(25), BuildNumber VARCHAR(25), CurrentDate TIMESTAMP DEFAULT CURRENT_TIMESTAMP)")
cur.execute("INSERT INTO Basic(Arena) VALUES(%s)", arenanumber)
cur.execute("ALTER TABLE Units ADD FOREIGN KEY(pnid) REFERENCES Basic(pnid);")
cur.execute("INSERT INTO Units(SerialNumber,pnid) VALUES(%s,LAST_INSERT_ID())", serialnumber)
cur.execute("SELECT * FROM Units")
print cur.fetchall()

如果这不起作用(我现在无法测试它),您可能需要执行SELECT LAST_INSERT_ID()并将其存储到变量中,然后将其用于你插入单位。