簡體   English   中英

在SQLite中創建相關表

[英]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.

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