【问题标题】:MySQL Get value inserted by trigger in JavaMySQL获取Java中触发器插入的值
【发布时间】: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。类似于InsertOutput 之类的东西,如MSSQLStatement.executeQuery("INSERT ...")。该解决方案必须是线程安全的,因此单独的INSERTSELECT 不是好的解决方案,因为在此期间可能还有另一个INSERT

感谢您的帮助!

【问题讨论】:

  • 还有其他方法可以实现线程安全
  • 不使用触发器,而是使用存储过程进行插入,并让它找到新的书号,这样它就可以插入返回数字。例如。见MySql: Insert a row and get the content
  • @Andreas 触发器不能与过程的插入一起工作,或者don't use the trigger 的原因是什么?但是谢谢你,不知道程序..这些将在Java中用Statement.executeQuery()调用?
  • 使用CallableStatement 调用。用存储过程替换触发器的原因是存储过程需要做SELECT MAX(book) + 1,所以它知道值,可以使用输出参数返回给调用者。
  • 原因啊.. 非常感谢!这解决了我的问题:)

标签: java mysql sql


【解决方案1】:

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

看起来像这样:

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

【讨论】:

  • 我承认,我没有在这里选择最好的例子。但是我不想把整张桌子放在这里,所以我用了这个例子。
  • LAST_INSERT_ID() 是否也适用于非自动增量字段?如我的示例所示?
  • @WhiteStripes 。 . .不可以。你可以使用LAST_INSERT_ID()获取插入行的自增主键值,然后在该行中查找其他值。
猜你喜欢
  • 2014-11-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-01-21
  • 2016-10-13
  • 1970-01-01
  • 2019-11-03
  • 2018-05-20
相关资源
最近更新 更多