Невозможно вставить значения в таблицу в реляционной базе данных Sqlite - PullRequest
0 голосов
/ 22 июня 2019

Я создал базу данных Sqlite с помощью DB Browser для Sqlite v3.10.1 с тремя таблицами: Book, Patron и Loan.Я успешно добавил некоторые примеры данных в таблицы Book и Patron, но когда я пытаюсь вставить некоторые данные в Loans, я получаю сообщение об ошибке, сообщающее, что ограничение внешнего ключа не выполнено.

  • Я попытался вставитьданные как из браузера БД, так и из Java-программы (включая код)

SQL-код для создания таблиц:

CREATE TABLE `Book` (
    `BookID`    INTEGER PRIMARY KEY AUTOINCREMENT,
    `ISBN`  TEXT NOT NULL,
    `Title` TEXT NOT NULL,
    `Author`    TEXT NOT NULL
);
CREATE TABLE `Patron` (
    `PatronID`  INTEGER NOT NULL PRIMARY KEY AUTOINCREMENT,
    `Name`  TEXT NOT NULL,
    `Address`   INTEGER NOT NULL
);
CREATE TABLE `Loan` (
    `LoanID`    INTEGER NOT NULL,
    `BookID`    INTEGER NOT NULL,
    `PatronID`  INTEGER NOT NULL,
    `BorrowDate`    TEXT NOT NULL,
    `DueDate`   TEXT NOT NULL,
    FOREIGN KEY(`BookID`) REFERENCES `Book`(`BookID`),
    FOREIGN KEY(`PatronID`) REFERENCES `Patron`(`PatronID`),
    PRIMARY KEY(`LoanID`)
);

Java-программа:

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;
import java.sql.Statement;

public class LibraryDatabase
{
    public static Connection connect() throws SQLException
    {
        Connection conn = null;

        // db parameters
        String url = "jdbc:sqlite:database.db";
        // create a connection to the database
        conn = DriverManager.getConnection(url);

        System.out.println("Connection to SQLite has been established.");

        return conn;
    }

    public static void main(String[] args) throws SQLException
    {
        Connection c = connect();

        Statement stmt = c.createStatement();
        String sql = "INSERT INTO Book (ISBN, Title, Author) VALUES ('978-1-4842-3272-9', 'Programming PIC Microcontrollers with XC8', 'Armstrong Subero');";
        stmt.execute(sql);
        stmt.close();

        String sql2 = "INSERT INTO Loans (BookID, PatronID, BorrowDate, DueDate) VALUES (1, 1, '23/06/2019', '23/07/2019')";
        stmt.execute(sql2);
    }
}

Сообщение об ошибке из браузера БД:

Error adding record:
FOREIGN KEY constrained failed (INSERT INTO
'Loan'() VALUES(1,0,0,",");)

Трассировка стека из программы Java:

Connection to SQLite has been established.
Exception in thread "main" java.sql.SQLException: [SQLITE_ERROR] SQL error or missing database (no such table: Loans)
    at org.sqlite.DB.newSQLException(DB.java:383)
    at org.sqlite.DB.newSQLException(DB.java:387)
    at org.sqlite.DB.throwex(DB.java:374)
    at org.sqlite.NativeDB.prepare(Native Method)
    at org.sqlite.DB.prepare(DB.java:123)
    at org.sqlite.Stmt.execute(Stmt.java:113)
    at LibraryDatabase.main(LibraryDatabase.java:32)

1 Ответ

0 голосов
/ 22 июня 2019

Вы должны сначала вставить Патрона и использовать внешний ключ этой таблицы для вставки в Кредит

попробуйте

    Statement stmt = c.createStatement();
    String sql = "INSERT INTO Book (ISBN, Title, Author) VALUES ('978-1-4842-3272-9', 'Programming PIC Microcontrollers with XC8', 'Armstrong Subero');";
    stmt.execute(sql);
    stmt.close();

    String sql2 = "insert into Patron (Name, Address) values ('a name', 'a adress')";
    stmt.execute(sql2);

    String sql3 = "INSERT INTO Loans (BookID, PatronID, BorrowDate, DueDate) VALUES (1, 1, '23/06/2019', '23/07/2019')";
    stmt.execute(sql3);
...