我想將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沒有外鍵。你必須打開它們。這樣做是一個非常好的主意。
你可以查看此鏈接https://sqlite.org/foreignkeys.html –
建議使用INTEGER ID。但是,這聽起來像是你只是有一個數據錄入問題。通常我會將原始數據導入到「staging」表中,不需要ID等。然後,我運行一些查詢將數據從staging移動到目標表格中,格式爲我想要的格式。例如'INSERT INTO staging_story('ArmorSmith','她接受修理的公會資金!')''只有'card_name'和'story_story'字段。通過'card_name'查找速度很慢,但僅在首次導入數據時發生。 – ebyrob