SQLite:如何将外键值插入交叉引用表

时间:2011-05-22 05:02:29

标签: sql sqlite

在SQLite版本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命令填充BooksAuthorsXRef数据表中的BookID和PersonID字段值,以使用Books表中特定Title的rowid值与给定Persons表中的rowid相关联LastName,FirstName和MiddleName值集?

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

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

并且,Persons表中填充了以下记录:

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

我将在SQLite中使用什么SQL命令来定义Tim Dorsey(Persons rowid = 1)是Books表(Books rowid = 1)中名为“Stingray Shuffle”的书的作者?

此外,根据数据表定义,是否需要进行任何更改以使BooksAuthorsXRef数据表中的书籍和人员交叉引用记录更易于管理和更容易,同时保持一定程度的参照完整性?

提前感谢您的时间,帮助和耐心。

1 个答案:

答案 0 :(得分: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'