首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >问答首页 >不带auto_increment的唯一id

不带auto_increment的唯一id
EN

Stack Overflow用户
提问于 2014-09-18 01:04:06
回答 4查看 7.1K关注 0票数 3

我有一个具有非自动递增主键的现有模式。该键在其他十几个表中用作外键。

我继承了一个有重大性能问题的程序。目前,当向该表添加新行时,创建新的唯一id的方式如下:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
1) a query for all existing primary key values is retrieved
2) a random number is generated
3) if the number does not exist in the retrieved values, use it, otherwise goto (2)

该应用程序是多线程和多服务器的,所以简单地在启动时获取一次现有的ids不是一个选择。我没有从发起请求中获取并转换为伪唯一值(如成员id)的唯一信息。

我知道在理论上可以在内部执行操作,以将自动递增添加到现有的主键。我知道系统地删除指向这个表的所有外键也是可能的,然后创建-重命名-插入一个新版本的表,然后添加回来的外键,但是这个表格式是由第三方应用程序决定的,如果我搞砸了,那么糟糕的事情就会发生。

有没有一种方法可以利用sql/mysql获得唯一的行值?

我想出的最接近的方法是从一个很大的空间中随机选择一个数字,并希望它在数据库中是唯一的,然后在发生奇怪的冲突时重试。

想法?

EN

回答 4

Stack Overflow用户

发布于 2014-09-18 01:12:12

如果表的主键未用于外键引用,则删除该主键。其目标是使您的列成为自动递增的主键。

因此,查找最大值,然后执行以下操作:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
alter table t modify id int not null auto_increment primary key;
alter table t auto_increment = <maximum value> + 1;

我不认为有必要显式地设置auto_increment值,但我喜欢确定。

票数 2
EN

Stack Overflow用户

发布于 2014-09-18 01:16:47

我认为你可以选择MAX(‘strange id-column’)+1,这个值是唯一的,你可以把sql代码和插入代码放在一个事务中,以防止出错。

票数 0
EN

Stack Overflow用户

发布于 2014-09-18 01:33:09

拉回所有主键值的列表(对于大型集合),然后生成伪随机值并通过检查列表来验证它的唯一性,这似乎真的很昂贵。

我看到这种方法的一个大问题是,当序列以相同的种子值启动时,伪随机数生成器将生成相同的值序列。

如果发生了这种情况,那么将会有一次又一次的冲突,直到序列达到一个尚未使用的值。下一次发生这种情况时,你会再次遍历整个列表,以添加另一个值。

我不明白为什么这个值必须是随机的。

如果不需要伪随机性,并且升序值也可以,那么如果我不想对现有表进行任何更改,我会这样做:

我将创建另一个具有auto_increment列的“id生成器”表。我对该表执行插入操作以生成id值。

我不会运行查询从现有表中拉回所有现有的生成器值,而是执行一个插入到“id- id”表中,然后执行一个SELECT LAST_INSERT_ID()来检索我刚插入的行的id,它将使用该值作为“生成的”id值。

基本上,模拟Oracle SEQUENCE对象。没有必要将所有行都保存在"id-generator“表中。因此,我可以删除所有id值小于最大id值的行。

如果需要伪随机性(抖动),我可能只会尝试插入,以此来确定键是否存在。如果由于键重复而导致插入失败,我将使用不同的id值重试。

伪随机生成器的重复序列吓到我了。如果我连续发生几次碰撞。这些是来自以前使用的序列,还是来自不同序列的值。我没有任何办法知道。放弃序列并重新开始一个新的种子,如果该种子以前已经被使用过,我将继续追逐之前生成的另一系列值。

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

https://stackoverflow.com/questions/25902626

复制
相关文章
C# 各种字符串格式
发布者:全栈程序员栈长,转载请注明出处:https://javaforall.cn/120407.html原文链接:https://javaforall.cn
全栈程序员站长
2021/12/27
6070
类型自定义格式字符串
String可能是使用最多的类型,ToString()则应该是大家使用得最多的方法了。然而它不应该仅仅是用来输出类型的名称,如果使用得当,它可以方便地输出我们对类型自定义的格式。本文将循序渐进地讨论ToString(),以及相关的IFormattable、IFormatProvider以及ICustomFormatter接口。
张子阳
2018/09/30
5860
PowerBI DAX 自定义格式字符串
PowerBI DAX 的格式化字符串并不是一个简单的话题,我们用一个篇章来介绍其中的规律。后续的内容会进一步扩展到复杂的应用中。
BI佐罗
2021/01/25
1.8K0
PowerBI 自定义格式字符串参考大全
这个参考暂时列出以上内容,如果您发现有什么自己写不出来的,可以留言,我们可以追加更新本列表。
BI佐罗
2021/02/12
6430
PowerBI 自定义格式字符串参考大全
C#判断字符串是否是有效的XML格式数据
  在try-catch语句块中,创建XmlDocument对象,并使用LoadXml方法加载xml字符串。如果没有异常,则说明xml字符串是有效的,返回true,反之为false。
追逐时光者
2023/04/08
1K0
C#使用ParseExact方法将字符串转化为日期格式
明志德道
2023/10/21
3520
C#使用ParseExact方法将字符串转化为日期格式
C#日期格式转换
DateTime dt = DateTime.Now; // Label1.Text = dt.ToString();//2005-11-5 13:21:25 // Label2.Text = dt.ToFileTime().ToString();//127756416859912816 // Label3.Text = dt.ToFileTimeUtc().ToString();//127756704859912816 // Label4.Text = dt.ToLocalTime().ToString(
欢醉
2018/01/22
1.9K0
C# 自定义类型通过实现IFormattable接口,来输出指定的格式和语言文化的字符串(例:DateTime)
在开发一些国际化的应用时,应用程序需要调用与当前线程不同的语言文化来格式化字符串.
郑小超.
2018/08/01
1.1K0
C# 自定义类型通过实现IFormattable接口,来输出指定的格式和语言文化的字符串(例:DateTime)
c# datetime 格式化
//c datetime 格式化 DateTime dt = DateTime.Now; Label1.Text = dt.ToString();//2005-11-5 13:21:25 Label2.Text = dt.ToFileTime().ToString();//127756416859912816 Label3.Text = dt.ToFileTimeUtc().ToString();//127756704859912816 Label4.Text = dt.ToLocalTime().ToSt
阿炬
2018/05/11
1.4K0
C#格式化输入数据为货币格式
明志德道
2023/10/21
2110
C#格式化输入数据为货币格式
java 获取字符串编码格式_输入字符串的格式要求
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。
全栈程序员站长
2022/09/30
1.5K0
spark dataframe 数据 转化为 json 或者自定义格式的字符串
文章大纲 创建dataframe 官方的方法 自定义格式 创建dataframe import org.apache.spark.sql.types._ val schema = StructType(List( StructField("integer_column", IntegerType, nullable = true), StructField("string_column", StringType, nullable = true),
流川疯
2021/12/06
1.2K0
spark dataframe 数据 转化为 json 或者自定义格式的字符串
C#将日期格式化为指定格式
明志德道
2023/10/21
2350
C#将日期格式化为指定格式
java json字符串格式化_格式化字符串攻击
大家好,我是架构君,一个会写代码吟诗的架构师。今天说一说java json字符串格式化_格式化字符串攻击,希望能够帮助大家进步!!!
Java架构师必看
2022/07/29
1.1K0
格式化字符串漏洞利用 三、格式化字符串漏洞
格式化字符串漏洞的通常分类是“通道问题”。如果二类不同的信息通道混合为一个,并且特殊的转义字符或序列用于分辨当前哪个通道是激活的,这一类型的漏洞就可能出现。多数情况下,通道之一是数据通道,它不会解析,只会复制,而另一个通道是控制通道。
ApacheCN_飞龙
2022/12/01
1.1K0
C#字符串截取
常用字符串截取 string str="123abc456"; int i=3; 1 取字符串的前i个字符 str=str.Substring(0,i); // or  str=str.Remove(i,str.Length-i);  2 去掉字符串的前i个字符: str=str.Remove(0,i);  // or str=str.Substring(i);  3 从右边开始取i个字符: str=str.Substring(str.Length-i); // or str=str.Remove(0,st
yaphetsfang
2020/07/30
2.3K0
字符串转时间格式
import java.text.ParseException; import java.text.SimpleDateFormat; import java.util.Date;
全栈程序员站长
2022/08/22
1.1K0
字符串转时间格式
logback自定义日志格式
然后在logback.xml配置文件中,定义自定义标签define name代表标签,class指向处理的类。在初始化时调用getPropertyValue()
全栈程序员站长
2022/08/15
8120
c# 导入导出excel表格式
c#使用代码导入excel时,当遇到纯数字且大于15位时会出现编码混乱(表现为科学计数法),要想呈现与excel表中纯数字格式和在数据库中呈现纯数字,操作如下:
wfaceboss
2019/04/08
1.6K0
c# 导入导出excel表格式
C# 字符串拼接
✅作者简介:人工智能专业本科在读,喜欢计算机与编程,写博客记录自己的学习历程。 🍎个人主页:小嗷犬的博客 🍊个人信条:为天地立心,为生民立命,为往圣继绝学,为万世开太平。 🥭本文内容:C# 字符串拼接 ---- C# 字符串拼接 1.通过加号拼接 2.字符串格式化 3.控制台打印拼接 ---- 1.通过加号拼接 C# 中,字符串没有相加的数学运算,但它可以通过加号+来进行字符串的拼接: using System; namespace ConsoleApplication { c
小嗷犬
2022/11/15
6750

相似问题

C#:自定义时区格式字符串

11

c#自定义日期类,字符串格式

13

列表C#中的自定义字符串格式

22

C#从字符串解析DateTime (自定义格式)

20

c#月份日历短日期字符串自定义格式

15
添加站长 进交流群

领取专属 10元无门槛券

AI混元助手 在线答疑

扫码加入开发者社群
关注 腾讯云开发者公众号

洞察 腾讯核心技术

剖析业界实践案例

扫码关注腾讯云开发者公众号
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
查看详情【社区公告】 技术创作特训营有奖征文