2011-05-22 77 views
0

鉴于以下数据表定义在SQLite的版本:SQLite的:HOWTO插入外键3.7.5数值到一个对照表

CREATE TABLE [Books] (
    [Title] VARCHAR(125) NOT NULL, 
    [YearPublished] INT, 
    CONSTRAINT [CK_YearPublished] CHECK(YearPublished >= 1400)); 

CREATE TABLE [People] (
    [FirstName] VARCHAR(25) NOT NULL, 
    [LastName] VARCHAR(45) NOT NULL, 
    [MiddleName] VARCHAR(25), 
    CONSTRAINT [UQ_PersonName] UNIQUE([FirstName], [LastName], [MiddleName])); 

CREATE TABLE [BooksAuthorsXRef] (
    [BookID] INT NOT NULL CONSTRAINT [FK_BookID] REFERENCES [Books]([rowid]), 
    [PersonID] INT NOT NULL CONSTRAINT [FK_PersonID] REFERENCES [People]([rowid])); 

我可以使用哪些SQL命令填充的BookID和是PersonID字段值BooksAuthorsXRef数据表使用Books表中特定Title的rowid的值与Persons表中的rowid关联给定的LastName,FirstName和MiddleName值集合?

我已经用一条记录填充了Books表;

INSERT INTO 
     Books  
VALUES 
     ('Stingray Shuffle', 2003); 

而且,个人表已经填充了以下记录:

INSERT INTO 
     People 
     (LastName, FirstName)  
VALUES 
     ('Dorsey', 'Tim')  

我会SQLite中使用什么SQL命令定义蒂姆·多尔西(人ROWID = 1)的作者书名为“Stingray Shuffle”的书(书籍rowid = 1)?

此外,基于数据表的定义,任何变化需要作出增加,并在BooksAuthorsXRef数据表更易于管理,并同时保持一定程度的引用完整性的变化更容易书籍和参考资料记录人不高兴?

预先感谢您的时间,帮助和耐心。

回答

1

如果您已经现有表与所有在这本书+人的数据,你可以做到以下几点:

INSERT INTO BooksAuthorsXRef 
SELECT  B.[rowid], P.[rowid] 
FROM  XRefTemp T 
INNER JOIN Books B 
ON   B.Title = T.Title 
INNER JOIN People P 
ON   P.FirstName = T.FirstName 
AND   COALESCE(P.MiddleName, '') = COALESCE(T.MiddleName, '') 
AND   P.LastName = T.LastName 

当插入个人的记录,last_insert_rowid()功能会给你的ROWID的您刚插入的图书/人物记录。

插入一条记录现有图书/人,使用方法:

INSERT INTO BooksAuthorsXRef 
SELECT  B.[rowid], P.[rowid] 
FROM  Books B 
INNER JOIN People P 
ON   P.FirstName = 'TheFirstName' 
AND   COALESCE(P.MiddleName, '') = 'TheMiddleName or empty if none' 
AND   P.LastName = 'TheLastName' 
WHERE  B.Title = 'TheBookTitle' 
+0

谢谢你,威尔。我是否正确地跟踪了您,我必须在名为XRefTemp的数据库中包含临时或物理第三个数据表,其中包含现有图书和人员数据表中的所有列,以便将新记录插入到BooksAuthorsXRef中?而且,当我添加一本新书,并在需要时将Person记录添加到每个相应的表中时,我还需要在XRefTemp表中插入交叉引用记录,然后才能更新BooksAuthorsXRef? – ClockEndGooner 2011-05-22 11:30:58

+0

有没有办法在不使用单独的临时或物理数据库表的情况下将记录插入到BooksAuthorsXRef中,假设我知道书的标题以及作者(Person)的姓氏和名字? – ClockEndGooner 2011-05-22 11:31:24

+0

@ClockEndGooner - 是的,对于批量加载,理想情况下,您将拥有一张表格,因为您所描述的任何内容都不允许您在Books/People表格中执行查找。如果您知道现有书籍记录的标题以及某人的First + Middle + Last名称,则只需使用上述第二个查询。 – 2011-05-22 14:41:00