[英]Creating related tables in SQLite
我正在SQLite中創建相關表,並且想知道使它們相互關聯的最有效方法是什么。
CREATE TABLE cards_name (id INTEGER PRIMARY KEY, name TEXT, rarity TEXT);
CREATE TABLE card_story (id INTEGER PRIMARY KEY, name_id INTEGER, story TEXT);
我已經為第一個表輸入了一些數據,我想知道如何將數據添加到第二個表中,而不必每次都檢查INTEGER PRIMARY KEY是什么(也許使用卡名?)。
26|Armorsmith|Rare
27|Auchenai Soulpriest|Rare
28|Avenging Wrath|Epic
29|Bane of Doom|Epic
例如,我想輸入Armorsmith的故事:“她接受行會資金進行維修!” 通過使用她的名字(Armorsmith)而不是ID(26)進入故事TEXT。
謝謝
您正在描述的任務應在應用程序級別(而不是數據庫級別)上處理。
您可以創建一個GUI,在其中可以選擇卡的名稱,但是發送回數據庫的基礎值是卡的ID,並且存儲在故事表中,以建立卡和故事之間的關系。
我想談談Armorsmith的故事,因為“她接受公會資金進行維修!” 通過使用她的名字(Armorsmith)而不是ID(26)進入故事TEXT。
您可以從另一個表插入一個表。 無需對值進行硬編碼,您可以從選擇中獲取它們。 只要select返回的行與插入所需的行匹配,它將起作用。
insert into cards_story
(name_id, story)
select id, :story
from cards_name
where name = :name
插入內容需要一個ID和一個故事。 選擇返回ID,我們為故事添加了自己的文本字段。
該語句將使用兩個參數執行,一個參數包含故事的文本,另一個參數包含人物的姓名。 因此,您可能會編寫類似這樣的內容(具體細節取決於您的編程語言和SQL接口庫)。
sql.execute(
name: "Armorsmith",
story: "She accepts guild funds for repairs!"
)
等效於:
insert into cards_story
(name_id, story)
select id, 'She accepts guild funds for repairs!'
from cards_name
where name = 'Armorsmith'
請注意,您需要對架構進行一些更改...
unique
否則您可能會為一個姓名獲得多張卡片。 就像name TEXT UNIQUE
。
由於您要按名稱查找卡,因此可能要防止存在多個具有相同名稱的卡。 那只是您不需要處理的復雜性。
像name_id INTEGER REFERENCES cards_name(id)
。
這有很多好處。 一種是鍵會自動索引,因此按name_id查找故事會更快。
另一個是它強制執行“參照完整性”,這是一種花哨的說法,可以確保每個故事都有一個與之相關的名稱。 如果您嘗試刪除card_name
,則除非首先刪除card_name
,否則card_story
。 您還可以使用諸如on delete cascade
上進行清理。
但是,SQLite默認情況下沒有外鍵。 您必須打開它們。 這樣做是一個非常好的主意。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.