我有一个MySQL数据库,包含一个带有auto_increment主键的表。
对于此示例,请考虑以下定义:
create table test(id integer not null auto_increment primary key) engine=innodb;
现在,我通常会使用以下语法插入此表:
insert into test() values();
这会适当地更新auto_increment值,这很好。
但是,我想在此表中插入一个较高的值(例如,1000000),但不让它更新auto_increment ID。
是否可以在此表中插入高值,以免对auto_increment ID的值产生影响?
我知道这是一种可怕的做法,但它会大大简化我必须做的一些事情。
提前致谢。
答案 0 :(得分:5)
MySQL 5.0允许您将任意值插入自动增量字段,但这确实会改变用于自动递增的下一个值。虽然您可以更改自动增量字段将使用的“下一个数字”(使用ALTER TABLE t AUTO_INCREMENT = number
),但这必须大于该列中当前的最大值。
所以,不,似乎你无法实现你的要求。
答案 1 :(得分:2)
你可以给你的行你喜欢的id。例如,给定以下表定义:
CREATE TABLE IF NOT EXISTS `stack-test` (
`id` int(10) unsigned NOT NULL auto_increment,
`name` varchar(255),
PRIMARY KEY (`id`)
);
以下查询将插入一个具有自动生成ID的行:
INSERT INTO `stack-test` (name) VALUES ('Peter');
此查询将插入一个具有用户定义ID的行:
INSERT INTO `stack-test` (id, name) VALUES (5, 'Joe');
通过查询所有行进行验证:
SELECT * FROM `stack-test`;
输出:
+----+-------+
| id | name |
+----+-------+
| 1 | peter |
| 5 | Joe |
+----+-------+
更新:请阅读,您不希望影响AUTO_INCREMENT
值。正如staticsan所提到的,AUTO_INCREMENT
字段自动使用最高值加1。有一个声明会将计数器重置为某个值,但只有在表中没有更高的值时才会起作用:
ALTER TABLE `stack-test` AUTO_INCREMENT = 2;
答案 2 :(得分:1)
我有一个类似的问题,虽然我喜欢上面的答案,但我通过使用两个表来解决它。一个用于高id,另一个用于低id。它非常适合我的特殊情况。
答案 3 :(得分:0)
我不相信 - 自动递增的字段必须是主键,因此不是空的。
答案 4 :(得分:0)
这是不可能的。如果计数器最终确实达到了你插入的那个非常高的数字,那么让你的行为与你建议的方式一样会引入一个重复的auto_increment值。
答案 5 :(得分:0)
如何保留一些初始值而不是最终值?我的意思是,保留ids,比如保留少于1000。将自动增量种子设置为1001,以便新插入后具有值,并使用IDENTITY INSERT在保留范围中添加值。
希望它有所帮助。
答案 6 :(得分:0)
很抱歉说出了流血'很明显,我根本不是RDBMS的专家,但不是你的要求所以"非正统的"它决定了另一种方法?你自己说你知道这是"可怕的做法"。关于自动增量字段的问题不在于它们只服务于一个目的和一个目的:为特定记录分配一个唯一的ID,并且它不是,嗯,绝对错误地将任何重要性归因于任何实际值?
所以,试探性地说,我可以建议使用另一个领域来做你想做的事吗?