回答

收藏

基于外键的MySQL第二个自动增量字段

技术问答 技术问答 122 人阅读 | 0 人回复 | 2023-09-13

我已经多次遇到此问题,但是还没有找到解决这种问题的“ MySQL方式”-我有一个包含 用户报告 的数据库。每个 报告 都有一个
8 a0 [, X0 |  S, [5 L6 xID ,我将其作为 报告编号 显示给我的用户。
6 L0 H0 Z+ J$ l' i; W) A1 V主要的抱怨是,用户对于为什么系统中缺少报告感到困惑。实际上并非如此。实际上,他们正在识别其ID之间的间隙,并假定这些ID缺少报告,而实际上,这仅仅是因为其他用户已填补了此自动递增的间隙。, V( U) q8 f4 R- O; Q0 b9 t
我需要知道在MySQL中是否有办法做到这一点:# j( K% T8 d! }8 d
我是否可以有一个 第二个 自动递增字段,称为 report_number ,它 基于一个user_id9 J+ k( _3 W# \3 h& Q. g
字段,该字段具有每个用户不同的一组自动递增值?) Y' f: @2 p8 m8 k8 I
例如
5 M0 D$ @+ }- m& f) _|------|---------|---------------|
' m: j3 c% d- Z. r# U|  id  | user_id | report_number |
$ g7 r" B6 B- \4 }" m; z0 B|------|---------|---------------|
4 w9 z1 l) W# ^' K1 `|  1   |    1    |       1       |
$ r+ O; n% N3 H, Q# ||  2   |    1    |       2       |
5 @/ w: z& G  o4 ?" T|  3   |    1    |       3       |* Y1 l. ?- P5 E9 b6 x
|  4   |    2    |       1       |
8 L* @+ [' R% ]+ y7 ]' h# u|  5   |    1    |       4       |/ p/ C* Y; Y% P* ]9 a% [
|  6   |    1    |       5       |  P* y9 X' k" \" @
|  7   |    2    |       2       |. ]: S; g' `/ E. r8 p: s$ _
|  8   |    3    |       1       |
1 O0 u9 I/ S- c" u5 l|  9   |    3    |       2       |3 {, g. D) }% j: Q3 ^# f
|------|---------|---------------|
: {+ u" e4 ^' d# {: n% ?' r% Q我为此使用 InnoDB ,因为它非常重视外键。当我添加第二个自动递增字段时,似乎出现了抱怨,但是我不确定是否有其他方法可以执行此操作?
- m( A1 C+ e# i- H) L( U% r                : Z' W7 R) d0 F& V
解决方案:5 `* n: J  H/ m* c+ T/ }# Q  A( n
               
/ Q6 ~- K' U; I7 {& [8 }. S+ L6 D5 A/ ]" w
  d, Z, V: H' ~* I
                MyISAM支持自动递增的第二列,但 InnoDB 不支持
4 V  i! w: s' c- n/ G对于InnoDB,您可以创建一个触发器BEFORE INSERT以获取reportid的最大值并将该值添加一个。* F3 v/ C$ l8 G! @- C' m8 X7 _
DELIMITER $$
5 |- B% Q+ d$ b5 UCREATE TRIGGER report_trigger" P0 u* Q3 A- ^
BEFORE INSERT ON reports% m8 O' }2 I2 m7 E3 V/ V$ H5 S- t
FOR EACH ROW BEGIN" w- }, Q* O5 G! c8 U% j
    SET NEW.`report_id` = (SELECT MAX(report_id) + 1 FROM reports WHERE user_id = NEW.user_id);2 `# B9 y" b# z; L" W
END $$1 u: y3 x0 B0 n( W7 ~; L2 }  W
DELIMITER ;, l  x6 v) \( ]+ @% t+ N0 q
如果可以改用MyISAM,则在MySQL页面的文档中有一个示例:% ^  `% Z9 L7 ~) G9 `
http://dev.mysql.com/doc/refman/5.0/en/example-auto-2 K8 S. Y& _/ t
increment.html
6 o+ F$ [8 H- }! `' uCREATE TABLE animals (- w- ~* C1 h) z) _
    grp ENUM('fish','mammal','bird') NOT NULL,
6 |  ~- c9 y) L4 G    id MEDIUMINT NOT NULL AUTO_INCREMENT,
! B2 y/ \  ^1 D+ F- T    name CHAR(30) NOT NULL,/ E$ i& W: m+ ~  k/ Y; ?* J
    PRIMARY KEY (grp,id)
2 B1 \7 `6 ^# H0 T% ?# |3 B) ENGINE=MyISAM;
) P& F6 d$ A1 [' v3 X: v; MINSERT INTO animals (grp,name) VALUES
/ T9 I2 P6 [8 [& W7 f1 \* B- k    ('mammal','dog'),('mammal','cat'),
$ R' y2 F- T' g' A0 ^9 h6 \0 W% f    ('bird','penguin'),('fish','lax'),('mammal','whale'),
: x+ P" D) O5 g$ k& y    ('bird','ostrich');! x4 K! l7 w& f& I' Y
SELECT * FROM animals ORDER BY grp,id;5 R$ w( B  l2 K6 j
哪个返回:
0 p9 `0 W- Z- v# l7 G8 s+--------+----+---------+
8 ]/ c! \* P% E$ {2 }) b* ]| grp    | id | name    |- _" ]/ R# t1 J5 E  D
+--------+----+---------+! f3 Q( G1 O3 O6 w" F$ [' f' l8 ~
| fish   |  1 | lax     |
# s9 Y' P+ G7 T- V7 y4 {, I| mammal |  1 | dog     |
) s7 d! a* N+ d$ R4 O! y7 C| mammal |  2 | cat     |
' L7 F/ A, ]/ r| mammal |  3 | whale   |
5 A$ L$ z0 g6 G" v) E| bird   |  1 | penguin |
5 x0 g( \% l( q* ^: c| bird   |  2 | ostrich |/ C2 s8 f, L: }* G8 B: f3 F) L; p
+--------+----+---------+
分享到:
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则