Связь один ко многим в Kotlin
Связь один ко многим означает: одна строка родителя
может иметь много дочерних, а каждая дочерняя
указывает ровно на одного родителя. В таблице книг
колонка author_id повторяет один и тот
же номер автора.
Два автора и три книги с общими внешними ключами оформляют так:
import java.sql.DriverManager
fun main() {
DriverManager.getConnection("jdbc:sqlite:otm_books.db")
.use { connection ->
connection.createStatement().execute(
"PRAGMA foreign_keys = ON"
)
connection.createStatement().use { statement ->
statement.execute(
"""
CREATE TABLE IF NOT EXISTS authors (
id INTEGER PRIMARY KEY,
name TEXT NOT NULL
)
"""
)
statement.execute(
"""
CREATE TABLE IF NOT EXISTS books (
id INTEGER PRIMARY KEY,
author_id INTEGER NOT NULL,
title TEXT NOT NULL,
FOREIGN KEY (author_id)
REFERENCES authors (id)
)
"""
)
}
val author = connection.prepareStatement(
"INSERT INTO authors (name) VALUES (?)"
)
author.setString(1, "Mira Cole")
author.executeUpdate()
author.setString(1, "Jon Reed")
author.executeUpdate()
val book = connection.prepareStatement(
"""
INSERT INTO books (author_id, title)
VALUES (?, ?)
"""
)
book.setInt(1, 1)
book.setString(2, "Quiet Harbor")
book.executeUpdate()
book.setInt(1, 1)
book.setString(2, "Stone Path")
book.executeUpdate()
book.setInt(1, 2)
book.setString(2, "Wide Field")
book.executeUpdate()
}
}
Подсчёт книг у автора выполняют фильтром по
author_id. У первого автора в примере
получается две строки:
import java.sql.DriverManager
fun main() {
DriverManager.getConnection("jdbc:sqlite:otm_books.db")
.use { connection ->
connection.createStatement().execute(
"PRAGMA foreign_keys = ON"
)
connection.createStatement().use { statement ->
statement.execute(
"""
CREATE TABLE IF NOT EXISTS authors (
id INTEGER PRIMARY KEY,
name TEXT NOT NULL
)
"""
)
statement.execute(
"""
CREATE TABLE IF NOT EXISTS books (
id INTEGER PRIMARY KEY,
author_id INTEGER NOT NULL,
title TEXT NOT NULL,
FOREIGN KEY (author_id)
REFERENCES authors (id)
)
"""
)
}
val author = connection.prepareStatement(
"INSERT INTO authors (name) VALUES (?)"
)
author.setString(1, "Mira Cole")
author.executeUpdate()
val book = connection.prepareStatement(
"""
INSERT INTO books (author_id, title)
VALUES (?, ?)
"""
)
book.setInt(1, 1)
book.setString(2, "Quiet Harbor")
book.executeUpdate()
book.setInt(1, 1)
book.setString(2, "Stone Path")
book.executeUpdate()
val count = connection.prepareStatement(
"""
SELECT COUNT(*) AS total
FROM books WHERE author_id = ?
"""
)
count.setInt(1, 1)
val result = count.executeQuery()
result.next()
println(result.getInt("total"))
}
}
В otm_books.db добавьте автора
"Eva Nash" и две его книги. Выведите
число книг с author_id этого автора.
Создайте otm_brands.db с таблицами
brands и models. Одной марке
сопоставьте три модели и выведите их названия.