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

SQLite:如何将外键值插入交叉引用表,sql,sqlite,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] V

给出了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命令来填充BookAuthorSxref数据表中的BookID和PersonID字段值,以使用Books表中特定标题的rowid值,并与Persons表中给定的LastName、FirstName和MiddleName值集的rowid相关联

我已经用一条记录填充了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”的书的作者

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


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

如果现有表中包含所有book+person数据,则可以执行以下操作:

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
插入个人记录时,函数将为您提供刚刚插入的图书/人物记录的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'

谢谢你,威尔。我是否正确地理解了在名为XRefTemp的数据库中必须有第三个数据表(临时或物理),该数据表包含现有Books和Persons数据表中的所有列,以便将新记录插入BooksAuthorsXRef?而且,当我向每个表中添加一本新书以及(如果需要)Person记录时,在更新BookAuthorsXRef之前,我还需要在XRefTemp表中插入一条交叉引用记录?有没有一种方法可以在不使用单独的临时或物理数据库表的情况下将记录插入BookAuthorsXRef,假设我知道这本书的书名以及作者(人)的姓和名?@ClockEndGooner-是的,对于批量加载,理想情况下,您应该有一个表,正如您所描述的那样,其他任何东西都不允许您对Books/People表进行查找。如果你知道一个现有图书记录的标题和一个人的名字,你只需要使用我上面包含的第二个查询;用于将新行插入BookAuthorsXRef数据库表的第二条SQL语句按预期工作。我确实注意到我使用的第三方Windows应用程序有一件事;如上所述执行“插入”操作会导致错误消息“外键不匹配”,而sqlite3.exe版本3.7.6.3的SQLite命令行工作正常。看起来我可能有一个bug要提交给第三方开发者审查。再次感谢您的时间、帮助和耐心。没问题,CEG-随时乐意为您提供帮助。我不知道re:外键不匹配很可能是个bug!