【发布时间】:2016-12-25 16:05:10
【问题描述】:
使用 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。类似于Insert 和Output 之类的东西,如MSSQL 或Statement.executeQuery("INSERT ...")。该解决方案必须是线程安全的,因此单独的INSERT 和SELECT 不是好的解决方案,因为在此期间可能还有另一个INSERT。
感谢您的帮助!
【问题讨论】:
-
还有其他方法可以实现线程安全
-
不使用触发器,而是使用存储过程进行插入,并让它找到新的书号,这样它就可以插入并返回数字。例如。见MySql: Insert a row and get the content。
-
@Andreas 触发器不能与过程的插入一起工作,或者
don't use the trigger的原因是什么?但是谢谢你,不知道程序..这些将在Java中用Statement.executeQuery()调用? -
使用
CallableStatement调用。用存储过程替换触发器的原因是存储过程需要做SELECT MAX(book) + 1,所以它知道值,可以使用输出参数返回给调用者。 -
原因啊.. 非常感谢!这解决了我的问题:)