web-dev-qa-db-ja.com

外部キーの予期しない動作

PythonでSqlite3を使用し、次のようにクエリを作成します。

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 constraint failed

それは問題のより単純なバージョンです。実際の問題では、executemanyを使用して挿入します。

2
Andy_Jake

cursor.executemanyが挿入しようとした外部キ​​ーの不一致が原因でエラーが発生したと思います。 TABLE2に挿入される外部キーがTABLE1(主キーホルダー)に存在しない場合、エラーがスローされます。

つまり、TABLE 1の主キー列に2つの値がある場合、TABLE2に値を挿入するときに、外部キーの値はTABLE1の主キー値の1つと正確に一致する必要があります。

1
Andy_Jake