MySQL获取Java中触发器插入的值

时间:2016-12-25 16:05:11

标签: java mysql sql

使用MySQL,我有以下SQL表定义:

CREATE TABLE books (
    author INT, 
    book INT, 
    name VARCHAR(128), 

    PRIMARY KEY(author, book)
);

我想要的是我有一个我手动设置的作者ID和一个为每个作者ID增加的书籍ID。因此我创建了一个类似的触发器:

CREATE TRIGGER trBooks
    BEFORE INSERT ON books
    FOR EACH ROW SET NEW.book = (
    SELECT COALESCE(MAX(book), -1) + 1 FROM books
    WHERE author = NEW.author
    );

这对我来说很好。但是现在我需要知道为插入的条目设置的book id,它是我在Java中插入的。类似Insert OutputMSSQLStatement.executeQuery("INSERT ...")之类的内容。解决方案必须是线程安全的,因此单独的INSERTSELECT不是一个好的解决方案,因为在此期间可能还有另一个INSERT

感谢您的帮助!

1 个答案:

答案 0 :(得分:0)

您的数据模型没有意义。你有两个实体,“书籍”和“作者”。每个应该表示为一个表。因为一本书可以有多个作者而作者可以写多本书,所以你需要一个联结表。

这看起来像这样:

CREATE TABLE Books (
    BookId INT auto_increment primary key,
    Title VARCHAR(255)
);

CREATE TABLE Authors (
    AuthorId INT auto_increment primary key,
    Name VARCHAR(255)
);

CREATE TABLE BookAuthors (
    BookAuthorId INT auto_increment primary key,
    AuthorId INT, 
    BookId INT, 
    CONSTRAINT fk_BookAuthor_BookId FOREIGN KEY (BookId) REFERENCES Books(BookId),
    CONSTRAINT fk_BookAuthor_AuthorId FOREIGN KEY (BookId) REFERENCES Authors(AuthorId),
    UNIQUE (AuthorId, BookId)
);

关于插入的问题。您不需要触发器来设置自动递增的ID。您可以使用LAST_INSERT_ID()来获取最近插入的值。