2011-05-22 31 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