我在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。
谢谢
答案 0 :(得分:0)
您所描述的任务应该在应用程序级别处理,而不是在数据库级别。
您可以创建一个GUI,您可以在其中选择卡的名称,但发送回数据库的基础值是卡的ID,并存储在故事表中,以确定卡与故事之间的关系。 / p>
答案 1 :(得分:0)
我想把Armorsmith的故事描述为“她接受行政资金维修!”使用她的名字(Armorsmith)代替ID(26)进入故事TEXT。
您可以从另一个表插入一个表。您可以从选择中获取它们,而不是对值进行硬编码。只要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
否则您可能会获得一个名称的多张卡片。赞name TEXT UNIQUE
。
由于您是按名称查找卡片,因此您可能希望防止存在多张具有相同名称的卡片。这只是你不需要处理的复杂性。
赞name_id INTEGER REFERENCES cards_name(id)
。
这有很多好处。一个是键被自动编入索引,因此通过name_id查找故事会更快。
另一个是它强制执行“参照完整性”,这是一种奇特的说法,它确保每个故事都有一个名称可以使用它。如果您尝试删除card_name
,除非首先删除card_story
,否则它将会失败。您还可以使用on delete cascade
之类的东西为您进行清理。
但是,SQLite默认情况下没有外键。你必须打开它们。这样做是个好主意。