2016-12-25 32 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()'獲取插入行的自動遞增主鍵值,然後查找該行中的其他值。 –