在SQLite中创建相关表

时间:2017-06-14 20:41:47

标签: sql 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。

谢谢

2 个答案:

答案 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默认情况下没有外键。你必须打开它们。这样做是个好主意。