2011-05-22 8 views
0

値:SQLiteの:ハウツー挿入外部キーは、SQLiteのバージョン3.7.5で次のデータ・テーブル定義を考えるとクロスリファレンステーブルに

私はBookIDとPERSONIDフィールド値を移入するために使用することができますどのようなSQLコマンド
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])); 

指定されたLastName、FirstName、MiddleNameの値セットについて、Booksテーブルの特定のTitleのROWIDの値をPersonsテーブルのROWIDに関連付けるBooksAuthorsXRefデータテーブル

書籍テーブルにはすでに1つのレコードが設定されています。

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

そして、人のテーブルには、以下のレコードが読み込まれました:私はSQLiteのに使用するどのようなSQLコマンド

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

を定義することティム・ドーシー(人ROWID = 1)の著者であります本の表(書籍rowid = 1)の "Stingray Shuffle"というタイトルの本?

また、BooksAuthorsXRefデータテーブルのBooks and Persons相互参照レコードの追加および変更を、ある程度の参照整合性を維持しながら、より管理しやすく、簡単にするために必要な変更はありますか?

ご協力いただきありがとうございました。

答えて

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を与えますあなたが挿入したばかりのBook/Peopleレコード。既存のブック/人のためにレコードを挿入するには

、使用:

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

は、ウィル、ありがとうございました。 BooksAuthorsXRefに新しいレコードを挿入するために、既存のBooksおよびPersonsデータテーブルのすべての列を含むXRefTempという名前のデータベースに、一時的または物理的な3番目のデータテーブルが必要であることを正しく守っていますか?そして、BooksAuthorsXRefを更新するには、XRefTempテーブルに相互参照レコードを挿入する必要があります。 – ClockEndGooner

+0

Bookのタイトルと著者(Person)のLastNameとFirstNameを知っていると仮定して、別の一時的または物理的なデータベーステーブルを使用せずにBooksAuthorsXRefにレコードを挿入する方法はありますか? – ClockEndGooner

+0

@ClockEndGooner - はい、一括読み込みの場合、理想的には説明したようにテーブルがあります。それ以外のものはBooks/Peopleテーブルへの参照を実行できません。既存のBooksレコードのタイトルとPersonのFirst + Middle + Lastの名前が分かっている場合は、上記の2番目のクエリを使用するだけです。 –