我正在写一个程序,通过python创建一个sqlite3数据库,我有一个Authors表(AuthorID,Name)和第二个books表(BookID,Title,AuthorID),创建如下:
Authors = sqlite3.connect('Authors.db')
Authors.execute('''CREATE TABLE Authors
(AuthorID INT PRIMARY KEY,
Name TEXT);''')
Authors.close()
Books = sqlite3.connect('Books.db')
Books.execute('''CREATE TABLE Books
(BookID INT PRIMARY KEY,
Title TEXT,
AuthorID INT,
FOREIGN KEY(AuthorID) REFERENCES Authors(AuthorID));''')
Books.close()
然后,我向每个表添加一条记录,如下所示:
Authors = sqlite3.connect('Authors.db')
Authors.execute("INSERT INTO Authors (AuthorID, Name) \
VALUES (1, 'Jane Austin')");
Authors.commit()
Authors.close()
Books = sqlite3.connect('Books.db')
Books.execute("INSERT INTO Books (BookID, Title, AuthorID) \
VALUES (1, 'Emma', 1)");
Books.commit()
Books.close()
数据库正确更新,但我不认为外键工作正常,因为它允许我删除作者'简奥斯汀',当有书籍与它相关联。
我看过一些教程使用这一行:
Books.execute("PRAGMA foreign_keys = 1")
这是问题的答案吗?如果是,我应该把这条线放在哪里?
4条答案
按热度按时间gv8xihay1#
PRAGMA foreign_keys
设置应用于连接,因此您应该在调用sqlite3.connect()
之后立即执行它。请注意,外键约束仅在同一数据库内有效;应该将两个表放入同一个文件中。
xtfmy6hx2#
因此,要做你想做的事情,你需要创建一个数据库文件与2表。
示例:
请注意,这两个表位于同一数据库中,您可以在connection之后和cursor对象之前添加该行。
希望这个有用。
ha5z0ras3#
还要注意,如果有活动事务,
PRAGMA foreign_keys
将不起作用。如果您尝试这样做,将不会出现错误消息,但外键仍将被关闭。如果即使在使用杂注之后仍遇到外键问题,那么在使用
COMMIT
之前尝试执行一次它可能是值得的。ukdjmx9f4#
仅供参考,根据最近的官方文件,您可以使用**
PRAGMA foreign_keys = ON
**。