2011-05-22 3 views
0

Учитывая следующие определения таблиц данных в SQLite версии 3.7.5:SQLite: Howto Вставка значения внешнего ключа в таблице Cross Reference

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 в таблице Person для заданного значения LastName, FirstName и MiddleName?

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

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

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

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

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

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

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

ответ

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 для Книга/Запись людей, которую вы только что вставили.

Для вставки записи для существующей книги/Person, используйте:

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

Спасибо, Уилл. Правильно ли я правильно слежу за тем, чтобы в базе данных с именем XRefTemp была записана третья таблица данных, содержащая все столбцы как из существующих таблиц данных Books, так и для того, чтобы вставлять новые записи в BooksAuthorsXRef? И когда я добавляю новую книгу и, если необходимо, запись Person в каждую соответствующую таблицу, мне также нужно будет вставить перекрестную запись в таблицу XRefTemp, прежде чем я смогу обновить BooksAuthorsXRef? – ClockEndGooner

+0

Есть ли способ вставить запись в BooksAuthorsXRef без использования отдельной временной или физической таблицы базы данных, предположив, что я знаю название книги и имя LastName и FirstName автора (Person)? – ClockEndGooner

+0

@ClockEndGooner - да, для массовой загрузки в идеале у вас будет таблица, как вы описали, поскольку что-то еще не позволит вам выполнять поиск в таблице Books/People. Если вы знаете название существующей книги «Книги» и «Первая + Средняя + Последние имена», вам просто нужно использовать второй запрос, который я включил выше. –

Смежные вопросы