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

MySQL获取Java中触发器插入的值,java,mysql,sql,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 EA

使用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
    );
这对我来说很好。但是现在我需要知道为我在Java中插入的条目设置的图书id。类似于
MSSQL
中带有
Output的
Insert
语句。executeQuery(“Insert…”)
。解决方案必须是线程安全的,因此单独的
INSERT
SELECT
不是好的解决方案,因为在此期间可能会有另一个
INSERT


谢谢你的帮助

您的数据模型根本没有意义。你有两个实体,“书”和“作者”。这些应分别表示为一个表。因为一本书可以有多个作者,一个作者可以写多本书,所以您需要一个连接表

这看起来像这样:

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\u INSERT\u ID()
获取最近插入的值。

还有其他实现线程安全的方法不使用触发器,而是使用存储过程进行插入,让它找到新书编号,这样它就可以进行插入并返回编号。例如,请参见。@Andreas触发器不会与过程的insert一起工作,或者不使用触发器的原因是什么?但是谢谢你,我不知道程序。。这些将通过Java中的
语句调用。executeQuery()
,使用调用。将触发器替换为存储过程的原因是存储过程需要执行
选择MAX(book)+1
,因此它知道该值,并可以使用输出参数将其返回给调用方。当然。。非常感谢你!这解决了我的问题:)我承认,我没有选择最好的例子。但我不想把整个表放在这里,所以我用了这个例子。LAST_INSERT_ID()是否也适用于非自动递增字段?如我的示例所示?@WhiteTripes。不可以。您可以使用
LAST\u INSERT\u ID()
获取插入行的自动递增主键值,然后查找该行中的其他值。