2016-12-25 42 views
-1

插入MySQL的获取值使用MySQL,我有以下SQL表定义:通过触发器在Java中

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。类似Insert,OutputMSSQLStatement.executeQuery("INSERT ...")。解决方案必须是线程安全的,因此单独的INSERTSELECT不是好的解决方案,因为在此期间可能还有另一个INSERT

感谢您的帮助!

+0

还有其他方法可以实现线程安全 – GurV

+0

不要使用触发器,而是使用存储过程插入,并让它找到新的书号,以便它可以插入*和*返回数字。例如。请参阅[MySql:插入一行并获取内容](http://stackoverflow.com/q/5432756/5221149)。 – Andreas

+0

@Andreas这个触发器是不是可以在插入过程中使用,或者“不使用触发器”的原因是什么?但是,谢谢你,不知道程序。这些将在Java中用'Statement.executeQuery()'调用? – WhiteStripes

回答

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()来获取最近插入的值。

+0

我承认,我没有在这里选择最好的例子。但我不想把整个桌子放在这里,所以我用这个例子。 – WhiteStripes

+0

LAST_INSERT_ID()是否也适用于非自动递增字段?像我的例子中所示? – WhiteStripes

+0

@WhiteStripes。 。 。不可以。您可以使用'LAST_INSERT_ID()'获取插入行的自动递增主键值,然后查找该行中的其他值。 –