簡體   English   中英

SQLite PRIMARY KEY 和 FOREIGN KEY 定義

[英]SQLite PRIMARY KEY and FOREIGN KEY definition

我想我在 PRIMARY KEY 和 FOREIGN KEY 的表定義中失敗了。

導入和創建在 sqlite3 數據庫中工作正常。 沒有錯誤信息。

這是我的聲明:

CREATE TABLE "contact" 
(
    "id" INTEGER NOT NULL,
    "uniqueid" INTEGER NOT NULL,
    "mod_time" TEXT,
    "mod_datetime" TEXT,
    "features_doorphone" TEXT,
    "setup" TEXT,
    "category" INTEGER,
    "pb_id" INTEGER NOT NULL,
    FOREIGN KEY("pb_id") REFERENCES "phonebook"("id_pb"),
    PRIMARY KEY ("id", "uniqueid", "pb_id")
);

但是,如果我嘗試將值寫入表中,則會出現此錯誤:

IntegrityError:NOT NULL 約束失敗:

追溯(最近一次通話):
db_insert_phonebook 中的文件“D:.._parser.py”,第 107 行
cur.executemany("INSERT INTO contact(uniqueid, category, pb_id) VALUES(?, ?, ?);", args[1])
sqlite3.IntegrityError:NOT NULL 約束失敗:contact.id

在處理上述異常的過程中,又出現了一個異常:

Traceback (most recent call last):
  File "D:\.._parser.py", line 134, in <module>
    fritz_phone_parser(file_path)
  File "D:\.._parser.py", line 96, in fritz_phone_parser
    db_insert_phonebook(meta_date, contact_l, person_l, telephony_l, services_l, person_img_l)
  File "D:\.._parser.py", line 106, in db_insert_phonebook
    with db as cur:
  File "D:\.._parser.py", line 36, in __exit__
    self.rollback()
AttributeError: 'SQLite_db' object has no attribute 'rollback'

這是我的 python 插入命令:

def db_insert_phonebook(*args):
 
    with db as cur:
        cur.execute("INSERT INTO phonebook(pb_name, pb_owner, pb_date_last_edit) VALUES(?, ?, ?);", args[0])
        print("Phonebook table filled") # pb_owner = pb_id

    with db as cur:
        cur.executemany("INSERT INTO contact(uniqueid, category, pb_id) VALUES(?, ?, ?);", args[1])
   

我插入的值都可用。 如果我只用一個 PRIMARY KEY 定義表,則插入工作沒有任何錯誤。

定義工作正常:

CREATE TABLE "contact" 
(
    "id" INTEGER NOT NULL,
    "uniqueid" INTEGER,
    "mod_time" TEXT,
    "mod_datetime" TEXT,
    "features_doorphone" TEXT,
    "setup" TEXT,
    "category" INTEGER,
    "pb_id" INTEGER,
    FOREIGN KEY("pb_id") REFERENCES "phonebook"("id_pb"),
    PRIMARY KEY("id")
);

我認為它與我的復合主鍵定義有關。 任何提示都非常受歡迎。 我忘了注意到我在內存數據庫上工作。

我的意思是解決方案是單字段主要+唯一約束:

CREATE TABLE "contact" 
(
    "id" INTEGER NOT NULL PRIMARY KEY AUTOINCREMENT,
    "uniqueid" INTEGER NOT NULL,
    "mod_time" TEXT,
    "mod_datetime" TEXT,
    "features_doorphone" TEXT,
    "setup" TEXT,
    "category" INTEGER,
    "pb_id" INTEGER NOT NULL,
    FOREIGN KEY("pb_id") REFERENCES "phonebook"("id_pb"),
    UNIQUE("id", "uniqueid", "pb_id")
);

在這里檢查

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM