如何在表MYSQL的子集内自动递增

时间:2012-06-04 09:29:51

标签: mysql auto-increment

为了说明我的问题,我将使用作者和书籍的类比。

我有2个表“作者”和“书籍”。作者是独一无二的,书籍使用外键约束与特定作者联系在一起。

我想知道是否有可能在“books”表中有一个名为“booknum”的列,该列在单个作者的子集中自动递增。因此,如果表格有100行并且我插入了作者的第4本书,那么它会将4放入“booknum”列。

db image

例如,如果books表有6行:

id | authors_id | booknum | name

1  | 1          | 1       | "hello"

2  | 1          | 2       | "goodbye"

3  | 2          | 1       | "booktitle"

4  | 3          | 1       | "more title"

5  | 1          | 3       | "nametwo"

6  | 2          | 2       | "nameone"

这在mysql中是否可行,或者我是否需要去检查最后创建的书籍并在添加书籍时手动增加?

2 个答案:

答案 0 :(得分:7)

您可以使用触发器:

CREATE TRIGGER biBooks 
  BEFORE INSERT ON books 
  FOR EACH ROW SET NEW.booknum = (
    SELECT COALESCE(MAX(booknum), 0) + 1 
      FROM books 
      WHERE authors_id = NEW.authors_id
  )
;

答案 1 :(得分:0)

单表语法:

UPDATE [LOW_PRIORITY] [IGNORE] table_reference
SET col_name1={expr1|DEFAULT} [, col_name2={expr2|DEFAULT}] ...
[WHERE where_condition]
[ORDER BY ...]
[LIMIT row_count]

多表语法:

UPDATE [LOW_PRIORITY] [IGNORE] table_references
SET col_name1={expr1|DEFAULT} [, col_name2={expr2|DEFAULT}] ...
[WHERE where_condition]

对于单表语法, UPDATE 语句使用新值更新指定表中现有行的列。 SET 子句指示要修改的列以及应该给出的值。每个值都可以作为表达式给出,或者关键字 DEFAULT 可以将列明确设置为其默认值。 WHERE 子句(如果给定)指定用于标识要更新的行的条件。使用 no WHERE 子句,所有行都会更新。如果指定了 ORDER BY 子句,则按指定的顺序更新行。 LIMIT 子句限制了可以更新的行数。

对于多表语法, UPDATE 更新table_references中指定的满足条件的每个表中的行。每个匹配的行都会更新一次,即使它与条件多次匹配也是如此。对于多表语法,不能使用 ORDER BY LIMIT