Foreign-Key

外鍵的意外行為

  • July 31, 2017

我想將 Sqlite3 與 Python 一起使用並創建如下查詢:

import sqlite3
from sqlite3 import Error

db = sqlite3.connect("temp.sqlite")
cursor = db.cursor()

cursor.execute("PRAGMA foreign_keys = ON") #Turns foreign_key support on

cursor.execute("""DROP TABLE IF EXISTS tx""")
cursor.execute("""CREATE TABLE tx (
                   tx_index BIGINT NOT NULL PRIMARY KEY,
                   hash CHAR(64) NOT NULL,
                   rbf INT NOT NULL, 
                   tx_in_value BIGINT NOT NULL,
                   tx_out_value BIGINT NOT NULL
                   );""")

cursor.execute("""INSERT INTO tx VALUES ('1','2','3','11','11')""")
cursor.execute("""INSERT INTO tx VALUES ('2','2','3','11','11')""")

cursor.execute("""DROP TABLE IF EXISTS txin""")
cursor.execute("""CREATE TABLE txin (
                   addr BIGINT NOT NULL,
                   value BIGINT NOT NULL,
                   tx_index BIGINT NOT NULL,
                   FOREIGN KEY (tx_index) REFERENCES tx (tx_index)
                   );""")

list_tuple = []
list_tuple.append(('11','12','1'))
list_tuple.append(('12','12','2'))
# Uncommenting the line below will throw an error
#list_tuple.append(('12','12','3'))

cursor.executemany("""INSERT INTO txin VALUES (?,?,?)""", list_tuple)

cursor.execute("""SELECT * FROM tx""")
cursor.execute("""SELECT * FROM txin""")

db.commit()
db.close()

上面的查詢,在沒有 Python here的情況下進行測試時,工作正常,但在 Python 中,執行會出現以下錯誤:

cursor.execute(“INSERT INTO txin VALUES (?,?,?)”, insert_trx_in) sqlite3.IntegrityError: FOREIGN KEY 約束失敗

這是問題的簡單版本。在實際問題中,我使用executemany插入任何想法?

我相信這個錯誤是由於cursor.executemany試圖插入的外鍵不匹配造成的。如果要插入 TABLE2 的外鍵在 TABLE1(主鍵持有者)中不存在,則會引發錯誤。

這意味著如果 TABLE 1 在主鍵列中有 2 個值,那麼在 TABLE2 中插入值時,外鍵的值必須與 TABLE1 中的主鍵值之一完全匹配。

引用自:https://dba.stackexchange.com/questions/182302