mssql如何自动生成id号
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了mssql如何自动生成id号相关的知识,希望对你有一定的参考价值。
mssql如何自动生成id号
请给出详细的语法,谢谢!
是由应用程序方插入的
如何防止自动增量跳过mysql数据库中的id号?
【中文标题】如何防止自动增量跳过mysql数据库中的id号?【英文标题】:how to prevent auto increment from skipping id numbers in a mysql database? 【发布时间】:2011-08-04 06:27:41 【问题描述】:好的,假设我有一个 mysql 数据库表,其中包含两列,一列用于 id,另一列用于密码。如果我有三行数据并且 id 值从 1 变为 3,我删除了第 3 行然后创建另一行数据,我将在新创建的行上看到 id=4 而不是 id=3。我知道这与自动增量值有关,但我想知道是否可以在 php 文件中添加一些代码,该文件将自动重置所有 id 编号,以便您从 id=1 开始并上升到最后一个 id 编号删除一行后增加 1?
我的目标是创建一个用户输入密码的表单,系统会将密码与数据库中的密码值进行匹配。如果匹配,则删除密码匹配的行,并重新排序 ID 号列,不跳过任何 ID 号。
更新:我正在通过将 1 到 4 的随机数设置为变量来制作旋转横幅广告系统,以便 php 文件将使用随机数变量检索从 id=1 到 id=4 的随机广告.如果随机数恰好是 3 且 id=3 不存在,那么在横幅广告的行中就会出现间隙。如果有办法解决这种情况下的巨大差距,请告诉我。提前谢谢
【问题讨论】:
为什么要重新排序? (除了不可能) 正如蒂姆所说,这是个坏主意。 你能解释一下为什么你想这样做吗?我不认为这很可能 - 但也许我们错过了什么? 我正在使用 for 循环制作旋转横幅广告。例如,我创建了一个变量来随机显示从 id=1 到 id=4 的广告。问题是,如果 id=3 不存在,如果系统在随机变量的值为 3 时尝试检索“ad 3”,它将在广告列中显示空白。我没有死心塌地消除差距,伙计们大声笑。 也许您可以使用“下一个”列而不是使用 for 循环? 【参考方案1】:只需执行以下 SQL 查询:
ALTER TABLE `tbl_name` AUTO_INCREMENT = 1;
……但这听起来是个糟糕的主意,所以不要这样做。为什么主键的值如此重要?唯一性更为重要,而重新设置它会破坏这一点。
【讨论】:
【参考方案2】:你只能使用
ALTER TABLE 'tbl' AUTO_INCREMENT=#
重置为高于最大值的数字。如果你有 1、2、3,并且你删除了 2,你不能用它来填充 2。如果你删除 3,你可以用它来重新使用 3(假设你没有放任何更高的东西)。这是你能做的最好的。
【讨论】:
【参考方案3】:ALTER TABLE 'table' AUTO_INCREMENT = 1;
但是运行此代码并不是最好的主意。如果您依赖没有间隙的列,则您的应用程序有问题。您是否要计算用户数量?如果是这样,请使用 COUNT(id)?您是否正在尝试处理其他表?如果是这样,请使用外键。
如果您一心想以错误的方式执行此操作,您可以尝试寻找最低的免费数字并自行递增。但是请记住,比赛条件涉及。
另外,请记住,如果您更改数据库中的实际数字,则需要更改其他表和代码中对它的所有引用。
【讨论】:
我注意到使用 1 会找到可能的最低数字。它不应该引起问题。【参考方案4】:好吧,您实际上可以指定您希望记录具有的 ID 号作为插入语句的一部分,例如:
INSERT INTO person VALUES(1,'John','Smith','jsmith@devnull.fake','+19995559999');
如果没有主键冲突(数据库中没有 id=1 的记录),那么 MySQL 会愉快地执行它。
ALTER TABLE 'tbl' AUTO_INCREMENT=#
也有效,这意味着您不必跟踪计数器。
不过,在您考虑这个问题时,您可能想阅读natural vs surrogate keys 上的一些讨论。让你的 id # 特别重要的想法有点不寻常,可能是设计问题的标志。
【讨论】:
【参考方案5】:你可以这样做:
-
发明一种机制,在您想要插入时提供下一个可用 id(例如,涉及在某处读取和递增整数列的事务 - 请特别注意事务隔离级别!)
使用
UPDATE
减少所有大于您刚刚删除的ID(同样,对于事务-不要忘记外键必须是ON UPDATE CASCADE!)
但它引出了一个问题:你为什么想要这个?值得麻烦吗?
几乎可以肯定,没有这种巫术,你可以实现任何目标。
更新(解决评论):
要选择随机数量的行,您可以执行例如在 MySQL 中
SELECT id FROM banners ORDER BY RAND() LIMIT 5
随机选择 5 个有保证的现有横幅 ID。
提醒一句: 有不少人将ORDER BY RAND()
视为性能不佳的猪。但是,恕我直言,将每个案例放在同一个篮子中并不完全正确。如果表中的行数是可管理的(我认为任何低于 10K 的都不会那么多),那么ORDER BY RAND()
提供了一个非常好的和简洁的解决方案。此外,the documentation 本身也建议采用这种方法:
但是,您可以在 像这样的随机顺序:
mysql> SELECT * FROM tbl_name ORDER BY RAND();
ORDER BY RAND() 结合 LIMIT 对于选择随机数很有用 从一组行中采样:
mysql> SELECT * FROM table1, table2 WHERE a=b AND c ORDER BY RAND() LIMIT 1000;
RAND() 并不意味着 一个完美的随机发生器。它是一个 快速生成随机数的方法 之间可移植的需求 相同 MySQL 版本的平台。
【讨论】:
我正在制作一个旋转横幅广告系统,方法是将 1 到 4 的随机数设置为一个变量,以便 php 文件使用 id=1 到 id=4 检索随机广告随机数变量。如果随机数恰好是 3 且 id=3 不存在,则横幅广告的行会有间隙。如果有办法解决这种情况下的巨大差距,请告诉我。 除了显示一行或一列随机广告外,我还需要确保没有广告重复。换句话说,它不会导致像“广告 1、广告 2、广告 1、广告 4”这样的情况,其中广告 1 在同一页面上出现两次。如果您的回复已经为该问题提供了解决方案,请原谅我,因为我浏览了它:D。以上是关于mssql如何自动生成id号的主要内容,如果未能解决你的问题,请参考以下文章