SQLite: Как вставить значения внешнего ключа в таблицу перекрестных ссылок - PullRequest
0 голосов
/ 22 мая 2011

С учетом следующих определений таблиц данных в 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 можно использовать для заполнения значений полей BookID и PersonID в таблице данных BooksAuthorsXRef, чтобы использовать значения для rowid для конкретного заголовка в таблице Books, который будет связан с rowid в таблице Persons для данного Набор значений LastName, FirstName и MiddleName?

Я уже заполнил таблицу Книг одной записью;

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

И таблица Persons заполнена следующей записью:

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

Какую команду SQL я бы использовал в SQLite, чтобы определить, что Тим Дорси (Persons rowid = 1) является автором книги под названием «Stingray Shuffle» в таблице Books (Books rowid = 1)?

Кроме того, основываясь на определениях таблицы данных, необходимы ли какие-либо изменения, чтобы сделать добавление и изменение записей перекрестных ссылок книг и лиц в таблице данных BooksAuthorsXRef более управляемыми и более простыми при сохранении некоторой степени ссылочной целостности?

Заранее спасибо за ваше время, помощь и терпение.

1 Ответ

1 голос
/ 22 мая 2011

Если у вас есть существующая таблица со всеми данными о книгах и персонах, вы можете сделать следующее:

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 () Функция выдаст вам идентификатор строки для только что вставленной записи о Книге / Людях.

Чтобы вставить запись о существующей Книге / Персоне, используйте:

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'
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...