我是一家服务于我的MySql数据库的主机公司的用户.由于它们的复制问题,自动增量值增加10,这似乎是一个常见问题.
我的问题是如何模拟(安全)自动增量功能,以便列具有连续的ID?
我的想法是实现一些序列机制来解决我的问题,但我不知道它是否是最好的选择.我在网上发现了这样的代码片段:
DELIMITER ;;
DROP TABLE IF EXISTS `sequence`;;
CREATE TABLE `sequence` (
`name` CHAR(16) NOT NULL,
`value` BIGINT UNSIGNED NOT NULL,
PRIMARY KEY (`name`)
) ENGINE=MyISAM DEFAULT CHARSET=latin1;;
DROP FUNCTION IF EXISTS `nextval`;
CREATE FUNCTION `nextval`(thename CHAR(16) CHARSET latin1)
RETURNS BIGINT UNSIGNED
MODIFIES SQL DATA
SQL SECURITY DEFINER
BEGIN
INSERT INTO `sequence`
SET `name`=thename,
`value`=(@val:=@@auto_increment_offset)+@@auto_increment_increment
ON DUPLICATE KEY
UPDATE `value`=(@val:=`value`)+@@auto_increment_increment;
RETURN @val;
END ;;
DELIMITER ;
Run Code Online (Sandbox Code Playgroud)
这似乎完全正确.我的第二个问题是这个解决方案是否兼并安全?当然是INSERT语句,但是ON DUPLICATE KEY更新呢?
谢谢!
我想创建一个像:
000000000001
Run Code Online (Sandbox Code Playgroud)
保存到数据库.我显然无法以这种方式(我不认为)在数据库中增加,所以我正在寻找最有效的方法从数据库中提取前一个数字并将其递增1以创建下一条记录:
000000000002
Run Code Online (Sandbox Code Playgroud)
等等...
如果我手动存储第一个数字,我可以进行某种手动输入以使其保持零的数量吗?我甚至不知道从哪里开始.
我有一张电子邮件表.
那里的自动增量id的最后一条记录是3780,这是一个合法的记录.我现在插入的任何新记录都在那里插入.
但是,在我的日志中我偶尔会:
Query FAIL: INSERT INTO mail.messages (timestamp_queue) VALUES (:time);
Array
(
[0] => 23000
[1] => 1062
[2] => Duplicate entry '4294967295' for key 1
)
Run Code Online (Sandbox Code Playgroud)
不知何故,自动增量上升到INT最大值4294967295
为什么在上帝的绿色地球上会如此高涨?我没有带有id字段的插入.
该表的显示状态,Auto_increment表现在为:4294967296
这样的事情怎么会发生?我意识到id字段应该是一个很大的int,但我担心的是,不知何故,这个东西会重新开始.
玩笑
编辑:更新
mysql版本5.0.45红帽修补
因为我将id设置为BIGINT,所以最后几个id看起来像:
3777
3778
3779
3780
4294967295
4294967296
4294967297
4294967298
4294967299
4294967300
Run Code Online (Sandbox Code Playgroud)
正如您所看到的,它们是渐进的,没有间隙(到目前为止).完全奇怪.
我需要将脚本从tsql转换为plsql,例如:
DECLARE @temp_id int
INSERT INTO表(col1,col2)VALUES(1,2)
SET @temp_id = @@ identity
但是,我很难找到类似于全局变量@@ identity的东西
Oracle专家有谁?
我有一些代码将删除数据库中的帖子:
mysql_query("DELETE FROM `posts` WHERE ID = '$id'");
Run Code Online (Sandbox Code Playgroud)
现在我想设置自动增量减一,以跟上删除的帖子.这可能吗?如果是这样,我该怎么办?谢谢!
我正在使用auto-increment为我的数据库中的每个新条目分配一个id.另外,根据当前的页面编号,我有一个php脚本,它从这个数据库中选择了10个.例如,如果当前页面为2,则脚本应选择id = 20和id = 29之间的每个条目.
现在,如果我删除一个条目,id就会丢失.因此,当id28被删除时,脚本将仅显示9次委托.
有没有办法auto-increment在删除e记录后重新分配值?
如果我正确输入数据,我的表工作正常 - 我可以插入数据,IDENTITY值为1,2,3,4.但是,如果我犯了错误并收到错误消息,例如
无法将值NULL插入列'x',表'table'; 列不允许空值.INSERT失败.
该语句已终止.
然后,如果我成功插入另一行,则IDENTITY值为6,而不是5.
我怎么解决这个问题?
如何创建将使用PHP插入数据库的字母数字auto_increment?我使用的数据类型是varchar.
例如:
SD1
SD2
SD3
Run Code Online (Sandbox Code Playgroud) 我有一个带有一个主键(即自动增量列)的inno-db表。我正在使用以下查询来查找下一个自动增量ID:
SELECT Auto_increment FROM information_schema.tables WHERE table_name='mytable';
Run Code Online (Sandbox Code Playgroud)
但是,当我查看结果时,我得到两行返回两个值(1352、123841)。我尝试过重置自动增量值,甚至删除了2000以下的行。如何重置表以返回单个结果?
我有一个命名的表employee,该表具有三列empid(即int),empname(varchar)和salary(int)。我已经制作了表格并插入了一些数据。现在我要进行empid自动递增。
我使用了命令:
ALTER TABLE employee ADD AUTO_INCREMENT(empid);
Run Code Online (Sandbox Code Playgroud)
但是我收到以下错误:
错误1064(42000):您的SQL语法有错误;检查与您的MySQL服务器版本相对应的手册以获取在第1行的'(empid)'附近使用的正确语法
auto-increment ×10
mysql ×6
php ×4
identity ×2
concurrency ×1
django ×1
oracle ×1
pdo ×1
python ×1
sequences ×1
sql ×1
sql-server ×1
ssms ×1