我在理解外键在sqlite3中的工作方式时遇到了一些麻烦。
我试图让一个表userstuff中的userid(james)在我的otherstuff表中显示为外键。然而,当我查询它时返回None。
到目前为止,我已经尝试过:
代码
将sqlite3导入为sq
班级DATAB:
def __init__(self):
self.conn = sq.connect("Atest.db")
self.conn.execute("pragma foreign_keys")
self.c = self.conn.cursor()
self.createtable()
self.defaultdata()
self.show_details() # NOTE DEFAULT DATA ALREADY RAN
def createtable(self):
self.c.execute("CREATE TABLE IF NOT EXISTS userstuff("
"userid TEXT NOT NULL PRIMARY KEY,"
" password TEXT)")
self.c.execute("CREATE TABLE IF NOT EXISTS otherstuff("
"anotherid TEXT NOT NULL PRIMARY KEY,"
"password TEXT,"
"user_id TEXT REFERENCES userstuff(userid))")
def defaultdata(self):
self.c.execute("INSERT INTO userstuff (userid, password) VALUES (?, ?)", ('james', 'password'))
self.c.execute("INSERT INTO otherstuff (anotherid, password, user_id) VALUES (?, ?, ?)",('aname', 'password', 'james'))
self.conn.commit()
def show_details(self):
self.c.execute("SELECT user_id FROM otherstuff, userstuff WHERE userstuff.userid=james AND userstuff.userid=otherstuff.user_id")
print(self.c.fetchall())
self.conn.commit()
import test2 as ts
x = ts.DATAB()
非常感谢
答案 0 :(得分:0)
外键约束只是一个约束。
这意味着它会阻止您插入违反约束的数据;在这种情况下,它会阻止您插入父表中不存在的非NULL user_id
值。
默认情况下,外键约束允许NULL值。如果要在没有父行的情况下阻止userstuff
行,请在user_id
列中添加NOT NULL约束。
在任何情况下,约束都不会神奇地生成数据(并且数据库无法知道您想要的ID)。如果要引用父表的特定行,则必须插入其ID。