嗨,我想为我的案例研究创建一个 php-sql 应用程序,其中我有以下属性:
图书 ID、图书名称、作者、编辑、ISBN
用户将输入书名、书号、作者和编者,并且每次用户输入时都会自动输入 ISBN 号。这可能吗?好吧,提前感谢您的帮助。
是的,您可以将ISBN
字段设为自动增量,从确定的数字开始
目前尚不清楚您为什么需要这个,但您可以使用BEFORE INSERT
触发器和单独的排序表来实现您的目标
表
-- A sequencing table
CREATE TABLE book_seq
(
id INT NOT NULL AUTO_INCREMENT PRIMARY KEY
);
-- Set initial value
ALTER TABLE book_seq AUTO_INCREMENT = 9000;
CREATE TABLE books
(
book_id INT,
book_name VARCHAR(256),
author VARCHAR(256),
editor VARCHAR(256),
isbn VARCHAR(12)
);
触发器
DELIMITER $$
CREATE TRIGGER tg_book_seq
BEFORE INSERT ON books
FOR EACH ROW
BEGIN
INSERT INTO book_seq VALUES(NULL);
SET NEW.isbn = CONCAT('8000-', LAST_INSERT_ID());
END$$
DELIMITER ;
现在您可以简单地插入行
INSERT INTO books (book_id, book_name, author, editor) VALUES
(1, 'Book1 Title', 'Author1', 'Editor1'),
(2, 'Book2 Title', 'Author2', 'Editor1');
您的伪 ISBN 号码将自动生成
| BOOK_ID | 书名 | 作者 | 编辑 | 国际标准书号 | -------------------------------------------------- -------- | 1 | Book1 标题 | 作者1 | 编辑1 | 8000-9000 | | 2 | Book2 标题 | 作者2 | 编辑1 | 8000-9001 |
这是SQLFiddle演示
另一种更简单的方法是INSERT ... SELECT
在插入时使用语法并计算下一个伪 ISBN 编号,如下所示
INSERT INTO books (book_id, book_name, author, editor, isbn)
SELECT 1, 'Book1 Title', 'Author1', 'Editor1',
CONCAT('8000-', COALESCE(SUBSTRING_INDEX(MAX(isbn), '-', -1), '8999') + 1) new_value
FROM books
这是SQLFiddle演示
注意:这种方法的主要缺点是,当两个或多个并发用户可能获得相同的MAX(isbn)
值从而产生具有重复 isbn 编号的行时,它可能会在并发环境中的重负载下失败。
就像 Trung-Hieu Le 在他的评论中写道:
ISBN 不应该是自动输入,但如果你真的想要,你应该看看
Auto Increment
如果您正在为特定项目处理您赢得的 ISBN 号码,那么是的,您可以设置一个字段以从您想要的号码开始自动递增,
但如果它不仅是您赢得的 ISBN 号码,而且您需要真实的书籍 ISBN 号码,那么您将需要一个包含书籍 ISBN 号码的 ISBN 号码数据库,那么每当用户输入书籍名称和其他详细信息时,ISBN 将自动根据与图书信息的匹配查询插入您的 ISBN 字段...
希望这有帮助