2017-06-14 159 views
0

我正在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)而不是身份證號碼(26)進入故事文本。

感謝

+0

你可以查看此鏈接https://sqlite.org/foreignkeys.html –

+0

建議使用INTEGER ID。但是,這聽起來像是你只是有一個數據錄入問題。通常我會將原始數據導入到「staging」表中,不需要ID等。然後,我運行一些查詢將數據從staging移動到目標表格中,格式爲我想要的格式。例如'INSERT INTO staging_story('ArmorSmith','她接受修理的公會資金!')''只有'card_name'和'story_story'字段。通過'card_name'查找速度很慢,但僅在首次導入數據時發生。 – ebyrob

回答

0

你所描述的任務應該在應用層被照顧,而不是在數據庫級別。

您可以創建一個可以選擇卡片名稱的GUI,但發送回數據庫的底層值是卡片的ID,並存儲在故事表中,以建立卡片和故事之間的關係。

0

我想將Armorsmith的故事寫成「她接受修理工會的資金!」通過使用她的名字(Armorsmith)而不是身份證號碼(26)進入故事文本。

您可以從另一個表中插入一個表。而不是硬編碼值,你可以從選擇中獲得它們。只要select返回的行匹配插入所需的行,它就可以工作。

insert into cards_story 
    (name_id, story) 
    select id, :story 
    from cards_name 
    where name = :name 

插入需要一個ID和一個故事。 select返回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否則你可能會爲一個名字獲得多張卡片。

Like name TEXT UNIQUE

由於您正在通過名稱查找卡片,因此您可能想要防止存在多張具有相同名稱的卡片。這只是你不需要處理的複雜性。

  • 聲明你的外鍵。

Like name_id INTEGER REFERENCES cards_name(id)

這有多個好處。一種是鍵被自動編入索引,因此通過name_id查找故事會更快。

另一方面,它強制執行「參照完整性」,這是一種說法,它確保每個故事都有一個名字可以與它一起使用。如果您嘗試刪除card_name,它將會受到阻礙,除非首先刪除card_story。您也可以使用像on delete cascade這樣的東西來爲您進行清理。

但是,默認情況下,SQLite沒有外鍵。你必須打開它們。這樣做是一個非常好的主意。