相关疑难解决方法(0)

如何在一张表中有两个自动增量列?

我有一个 MySQL 表,其中包含有关公司发票的信息。但是,这家公司有两个分公司,每个分公司都有独特的开票顺序;可以说是“意甲”和“意甲”。但是,这是一家公司,我不想创建两个发票表。相反,我想为一张表设置两个不同的自动增量。我知道这在技术上是不可能的,但我想这是其他人以前解决过的一个问题,所以我想知道这个问题是否有一个众所周知的“解决方案”?

我现在正在做的不是使用主键作为发票编号(这将是理想的),而是使用带有发票 ID 的辅助列,该列是手动递增的(嗯,使用 PHP 脚本,但它仍然不是自动的),通过检查该特定系列的最新发票。

这是我目前的设置:

CREATE TABLE `invoices` (
  `id` mediumint unsigned NOT NULL AUTO_INCREMENT PRIMARY KEY,
  `invoicenumber` mediumint unsigned NOT NULL,
  `branch` enum('A','B') NOT NULL,
  `date` date NOT NULL,
  `client` varchar(100) NOT NULL
) COMMENT='' ENGINE='InnoDB';
Run Code Online (Sandbox Code Playgroud)

要检查延迟发票,我运行:

SELECT MAX(invoicenumber+1) AS new_invoice_number FROM invoices WHERE branch = 'A'

mysql database-design

9
推荐指数
1
解决办法
2万
查看次数

MySQL在没有自动增量的情况下获取下一个唯一值

我有一个 MySQL 数据库 (InnoDB),我正在开发它用于跟踪我组织的工作订单。有多个“站点”,每个站点的工作订单号从 100 开始。

WorkorderID    SiteID    SiteWorkorderNum
     1           1            100
     2           1            101
     3           2            100
Run Code Online (Sandbox Code Playgroud)

WorkorderID是自动增量字段。
SiteIDSiteWorkorderNum都设置为唯一约束。

每当即将为特定站点插入新工作订单时,应用程序都会检查登录者的站点 ID 的 max(SiteWorkorderNum) 并将该值返回到插入语句。我想避免的问题是,同一站点的两个用户是否同时输入新的工作订单。

我有几个可能的解决方案,但我想看看是否有更好的方法,因为每个方法都有其缺点,但我确信一个会比另一个更好,当然我对新想法持开放态度。

1)锁定表以保证在我们检索并插入我们的值之前没有其他用户检索 SiteWorkorderNum 值(但是假设我们每分钟有成千上万的用户试图输入工作订单,表锁定不会减慢速度吗? )

2)不要锁定表,检索下一个可用的 SiteWorkorderNum 并尝试插入到数据库中,如果我收到一个唯一约束错误,请捕获该错误并重试,直到我成功。(这可能会释放表,但再次假设我们在同一站点有数千个用户,多个数据库调用是否会有点低效?)

我是否对这些解决方案中的任何一个“可能”影响性能过于偏执?当然,我没有成千上万的用户,但我想在这个设计中应用最佳实践,以防我曾经在一个流量很高的项目上工作。

mysql constraint auto-increment locking

7
推荐指数
1
解决办法
2万
查看次数

InnoDB 表的多列索引中的 MySQL 和 AUTO_INCREMENT 列:支持状态?

在 InnoDB 表的多列索引中缺少对 AUTO_INCREMENT 列的支持是一个广为人知的限制,就像需要时的触发器解决方法一样(参见例如这篇文章)。然而,昨天,我遇到了这个帖子,声称早在 5.1 就添加了对该功能的支持。我在我的 5.7 安装 (mysql-community-server-5.7.19-1.el7.x86_64) 上尝试了以下语句,它似乎完美地工作:

CREATE TABLE `tbl1` (
`id` int(11) unsigned NOT NULL AUTO_INCREMENT,
 `data` datetime NOT NULL,
  PRIMARY KEY (`id`,`data`)
 ) ENGINE=InnoDB;
Run Code Online (Sandbox Code Playgroud)

我的问题是,在我的一生中,我无法在 MySQL 的文档站点或其他地方找到对该功能的支持的肯定声明。我对在生产中部署一些未经宣布的东西(可能是实验性的)相当谨慎,所以我希望有人能指出我的官方状态。

编辑:事实证明,该手册在不相关的部分包含了这个相当间接的声明

“……带有 AUTO_INCREMENT 列的 InnoDB 表至少需要一个键,其中自动增量列是唯一或最左边的列。”

这表明但没有说明支持。

编辑 2:使用下面来自@rolandoMYSQLDBA 的信息,我还找到了这个附加片段“AUTO_INCREMENT 列必须作为 InnoDB 表索引中的第一列出现。” . 因此,我接受他的回答。

如果有人想知道,表分区需要多列索引 - 客户在所有表上都有 auto_increment PK 并且他们想要在日期列上进行分区。

mysql innodb index

6
推荐指数
1
解决办法
3858
查看次数

我应该用整数主键替换我的 varchar 主键吗?

我有一个表,它有一个与“基本产品代码”相关联的 varchar 主键。它们很少更改,如果更改,通常只是被删除或添加。我认为最好为部分产品代码编制索引,以便我可以根据部分产品代码对数据执行搜索。

例如,“基本产品代码”采用以下格式:

ABC-AB12

该表存储了产品和配件之间的关系,每个产品或配件可以有多个关系:

Id          |     Prod     |    Acc    | Val
---------------------------------------------
ABC-AB12_1  |    ABC-AB12  |   ABC1    |  1
ABC-AB12_2  |    ABC-AB12  |   DEF1    |  2
ABC-AB12_3  |    ABC-AB12  |   GHI1    |  A
Run Code Online (Sandbox Code Playgroud)

我将每个关系的 id 存储为产品基本代码,并在其末尾附加一个整数。

我想如果我需要搜索特定产品的所有关系,使用主键和搜索会比在Prod列上搜索更快。

这是一个错误的假设吗?我应该将其Id改为自动递增的整数吗?

mysql innodb primary-key varchar

5
推荐指数
1
解决办法
3733
查看次数