有一个表“上下文”。有一个自动增量 ID“context_id”。我正在使用序列来检索下一个值。
SELECT nextval('context_context_id_seq')
Run Code Online (Sandbox Code Playgroud)
结果是:1, 2, 3,...20....
但是“上下文”表中有 24780 行
如何获得下一个值 (24781)?
我需要在 INSERT 语句中使用它
在大学的最后一节课(我是学生)中,讲师要求我们开发一个数据库(如果重要的话,MySQL 服务器)和使用该数据库作为数据源的小型客户端应用程序。
要求之一是标识列(即每个表中的 PK)必须是连续的,因为这是一个很好的做法(按照讲师的话)。也就是说,当表行被删除时,它的 PK 必须在后续插入中重用。我对 RDBMS、PK 和身份列有一般的了解。据我了解,该标识列只是一种让 DB 在插入行时自动生成 PK 的方法,仅此而已。并且标识列值不得以任何方式与行属性相关(只要它不是自然键)。
这个要求(严格顺序标识列)对我来说是可疑的。我试图问讲师如果身份不是顺序的(由删除引起的差距)有什么问题,但得到了非常抽象的答案,比如“这对用户来说很方便,对维护数据库的数据库管理员很有用”。没有具体的例子。“方便用户”的说法听起来很傻,因为它在业务领域没有任何意义。
因此,我很好奇这些原因是否真实?我只能想到一种需要重新设置身份列的情况——当身份空间耗尽时。但是当标识列类型选择不正确时,这是更多的设计问题,说简单int而不是bigint或uniqueidentifier当表包含十亿行。假设,一个标识列是一个聚集索引:标识列中的间隙会影响索引性能吗?也许我不知道在每次删除后自动标识列重新播种的其他现实原因?
提前致谢!
我知道 MySQL 将 auto_increment 列限制为主键。为什么是这样?我的第一个想法是这是一个性能限制,因为某处可能有一些计数器表必须锁定才能获得此值。
为什么我不能在同一个表中有多个 auto_increment 列?
谢谢。
前几天我安装了 MySQL Workbench,访问了我公司的数据库,并为自己制作了一张表。到现在为止还挺好。问题是,我注意到我的auto_increment以 2 递增 2。例如:
ID NAME
1 Paul
3 Jack
5 Louis
7 John
...
Run Code Online (Sandbox Code Playgroud)
当我这样做时SHOW VARIABLES LIKE 'auto_inc%':
'auto_increment_increment', '2'
'auto_increment_offset', '1'
Run Code Online (Sandbox Code Playgroud)
所以我尝试设置auto_increment_increment为 1 :
SET @@auto_increment_increment=1
Run Code Online (Sandbox Code Playgroud)
再次验证后,SHOW VARIABLES LIKE 'auto_inc%'我确认它“有效”的结果是:
'auto_increment_increment', '1'
'auto_increment_offset', '1'
Run Code Online (Sandbox Code Playgroud)
但是我的 ID仍然以2为单位递增2。
我第一次这样做时,它运行良好,然后我关闭了 MySQL Workbench,发现当我再次打开它时,它再次auto_increment_increment设置为2。现在我想再做一次,但它似乎不再起作用了。
任何人都可以帮我解决这个问题吗?
谢谢你们。
我有一个包含自动递增主键 ID 的表。如果我删除最后一行(最高 id,例如 id = 6)并插入新行,则新 id 从 7 开始。我必须更改哪个参数才能使主键从 6 开始?
CREATE TABLE animals (
id MEDIUMINT NOT NULL AUTO_INCREMENT,
name CHAR(30) NOT NULL,
PRIMARY KEY (id)
) ENGINE=MyISAM;
INSERT INTO animals (name) VALUES
('dog'),('cat'),('penguin'),
('lax'),('whale'),('ostrich');
Run Code Online (Sandbox Code Playgroud)
结果:
id 名称
1 狗
2 猫
3 企鹅
4 松懈
5 鲸鱼
6 鸵鸟
DELETE FROM animals WHERE id = 6;
INSERT INTO animals (name) VALUES
('x');
Run Code Online (Sandbox Code Playgroud)
结果:
id 名称
1 狗
2 猫
3 企鹅
4 松懈
5 鲸鱼
7 …
我们有一个数据库,每当我们从我们的服务收到订单时,我们就会将数据插入表中。
我们auto_increment用来生成 ID 并分配相同的订单。这通常在任何地方都是一样的。
但问题是,由于这些信息被传递给第三方供应商,他们能够追踪我们每天收到的订单数量。通过在清晨发送一个请求并在午夜发送另一个请求并计算ID.
这是提供有关我们服务的洞察信息。由于它是一个有点复杂的系统,我们不能做可以随机化它的复杂操作。
我最初的想法是以auto_increment位随机方式生成数字。
1,2,3,4,5,67,68,69,70,71,133,134,135,136,137,189,190,191,192,193,194
Run Code Online (Sandbox Code Playgroud)
我想这应该很简单,因为 Mysql 用完了缓存,通过附加一些随机数来生成下一个序列。
如何在不影响性能的情况下实现这一目标?
也许对这个社区来说,我的问题很简单,但对我(一个简单的 Java 程序员)来说,这是一个大问题。
我有一个包含越来越多数据的大数据库。因此,外部数据库管理员创建了一个作业,在临时表中向我显示我需要的数据。但是他创建了没有主键的表,当我的 java 项目去读取这个表时,我得到一个错误。
我无法读取此表,因为主键不存在。
我可以在程序中插入创建自动增量主键的可能性,而不改变这个复杂程序的结构吗?
这是存储过程代码的开头:
USE [MYDB]
GO
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
ALTER Procedure [dbo].[spSchedula_Scadenzario]
as
begin
drop table MYDB.dbo.tmpTable
select
aa.*
into MYDB.dbo.tmpTable
from (...)
Run Code Online (Sandbox Code Playgroud)
提前致谢
我有一个 MySQL 数据库 (InnoDB),我正在开发它用于跟踪我组织的工作订单。有多个“站点”,每个站点的工作订单号从 100 开始。
WorkorderID SiteID SiteWorkorderNum
1 1 100
2 1 101
3 2 100
Run Code Online (Sandbox Code Playgroud)
WorkorderID是自动增量字段。
SiteID和SiteWorkorderNum都设置为唯一约束。
每当即将为特定站点插入新工作订单时,应用程序都会检查登录者的站点 ID 的 max(SiteWorkorderNum) 并将该值返回到插入语句。我想避免的问题是,同一站点的两个用户是否同时输入新的工作订单。
我有几个可能的解决方案,但我想看看是否有更好的方法,因为每个方法都有其缺点,但我确信一个会比另一个更好,当然我对新想法持开放态度。
1)锁定表以保证在我们检索并插入我们的值之前没有其他用户检索 SiteWorkorderNum 值(但是假设我们每分钟有成千上万的用户试图输入工作订单,表锁定不会减慢速度吗? )
2)不要锁定表,检索下一个可用的 SiteWorkorderNum 并尝试插入到数据库中,如果我收到一个唯一约束错误,请捕获该错误并重试,直到我成功。(这可能会释放表,但再次假设我们在同一站点有数千个用户,多个数据库调用是否会有点低效?)
我是否对这些解决方案中的任何一个“可能”影响性能过于偏执?当然,我没有成千上万的用户,但我想在这个设计中应用最佳实践,以防我曾经在一个流量很高的项目上工作。
我需要创建一个database model包含一个字段来存储 20 位唯一值的字段。许多客户端将通过 API 使用它。
该值必须为 20 位长、数字且唯一。最好的方法似乎是创建一个自动增量big-int字段,但 big-int 支持的值最大为 9223372036854775807(19 位)。使用numeric(20,0)是无用的,因为尽管数字支持更大的值,但 Postgres 8.4 不允许我创建sequence并引发错误
CREATE SEQUENCE my_sequence_name INCREMENT BY 1 NO MINVALUE NO MAXVALUE START WITH 10000000000000000101;
Run Code Online (Sandbox Code Playgroud)
错误:值“10000000000000000101”超出 bigint 类型的范围
为了数据完整性,我必须在 POstgresql 中处理这个问题。处理这个问题的有效方法是什么?
我正在使用 Postgresql 8.4 和 Django 1.3
更新:我想最好澄清一下......我试图找到一种在 DBMS 中解决这个问题的方法。因此,除非我别无选择,否则将避免任何非数据库解决方案。休息是我的问题的原因:
我正在制作一个与银行通信以进行 3D 安全操作的 API。银行 API 需要一个20 位的唯一数字标识符来进行交易,所以我决定创建一个 ID 值,我可以将它用于银行 API 和我将使用该表等的API。
说明10000000000000000101是因为,银行 API 希望它是一个有效的20 位数字 …
我需要一种方法来保持 mysql 服务重启之间的自动递增计数器。
正如文档所述,重启 mysql 自动增量计数器默认从 max(id)+1 开始。如何保留最后一个自动增量值?
这对我来说是个大问题。我正在使用 envers 来保持实体审计。我得到的错误与我删除的“最后一行”一样多。
假设我开始将数据插入到一个空表中。假设插入 10 行。然后假设删除最后 8 个。在我的表中,我将有 2 个实体作为结果,id 分别为 1 和 2。在审计表中,我将拥有所有 10 个实体,ID 为 1 到 10:ID 为 3 到 10 的实体将有 2 个操作:创建操作和删除操作。
自动增量计数器现在在主表中设置为 11。重新启动mysql服务自动递增计数器变为3。所以如果我插入一个新实体,它将以id 3保存。但在审计表中已经有一个id = 3的实体。该实体已经被标记为创建和删除. 它会在更新/删除操作期间导致断言失败,因为 envers 无法处理这种不一致的状态。
谢谢
auto-increment ×10
mysql ×7
identity ×2
postgresql ×2
primary-key ×2
constraint ×1
innodb ×1
insert ×1
locking ×1
mariadb ×1
mysql-5.5 ×1
random ×1
select ×1
sql-server ×1