首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >组合键,列在外键值更改时自动递增和重置

组合键,列在外键值更改时自动递增和重置
EN

Database Administration用户
提问于 2020-04-14 00:02:41
回答 1查看 469关注 0票数 0

我试图实现一个票务系统,产生的数字将是连续的。

4000,4001,4002,4003

我的想法是拥有一个与当前抽奖相关的表,而ticket_no列是一个自动增量列,当外键更改时,它会重置。

复合键是raf_idticket_no,因为在相同的抽奖中不应该多次存在票证no。

这个是可能的吗?

代码语言:javascript
运行
复制
|------------|-----------|---------|
| raf_id     | ticket_no | user_id |
|------------|-----------|---------|
| 1          | 4000      | 1       |
| 1          | 4001      | 1       |
| 1          | 4002      | 2       |
| 1          | 4003      | 3       |
| 2          | 4000      | 4       |
| 2          | 4001      | 4       |
| 2          | 4002      | 5       |
| 2          | 4003      | 1       |
|------------|-----------|---------|
EN

回答 1

Database Administration用户

发布于 2020-04-14 12:44:44

自动?

未知。很有可能不是。(如:没有开箱即用的数据库功能)

手册?

是。

您需要跟踪表中的“最后使用的数字”。例如

代码语言:javascript
运行
复制
create table raf (
  raf_id        int, -- identity/autoincrement
  last_number   int default 4000 not null,
  constraint raf_pk primary key (raf_id)
);

从这里开始,您的流程需要这样进行:

  1. RAF_ID抓取一个锁
  2. “计算”下一个数字。
  3. 更新RAF表。
  4. 在另一个表中使用该值
  5. COMMIT数据
  6. 打开锁。

根据您的RDBMS,可以将一些步骤组合成一个步骤。如何做这些事情(例如“抓取锁”的最佳实践)也可以是依赖于RDBMS的。

Notes

“抓取锁”步骤将序列化您的代码。这对数据库不好。此要求/过程将限制添加新行的速度。我建议您考虑其他方法(例如使用VIEWRANK() )。

这可以在TRIGGER中实现吗?也许吧。

票数 0
EN
页面原文内容由Database Administration提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://dba.stackexchange.com/questions/264928

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档