在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数据表中的书籍和人员交叉引用记录更易于管理和更容易,同时保持一定程度的参照完整性?
提前感谢您的时间,帮助和耐心。
答案 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'