使用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
);
这对我来说很好。但是现在我需要知道为插入的条目设置的book id,它是我在Java中插入的。类似Insert
Output
与MSSQL
或Statement.executeQuery("INSERT ...")
之类的内容。解决方案必须是线程安全的,因此单独的INSERT
和SELECT
不是一个好的解决方案,因为在此期间可能还有另一个INSERT
。
感谢您的帮助!
答案 0 :(得分: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()
来获取最近插入的值。