MySQL插入一行,其中列值与自增相同

5

id列是自动递增的。我希望“rank”列的值与从“id”列新生成的自动递增值相同(例如,假设下一个自动递增值为999...我也想让rank等于这个值)。

我能否在一个查询中完成此操作?还是必须运行额外的查询以获取自动递增值?

$query = "INSERT INTO $table1(id,name,rank)
VALUES('','bob','999')";

为什么要让两列具有相同的值?看起来你只需要在需要“rank”的任何地方引用“id”即可... - kittykittybangbang
我能想象的唯一可能是,您希望稍后更改等级,但ID始终保持不变。在这种情况下,您可以在开始时将等级设置为-1或NULL或类似值,并始终使用ID作为等级(如果找到此值)。 - hoijui
2
rank 的值会在插入时与 id 相同。不过这是一个好的点 :) - Bxx
2个回答

5

您可以使用以下查询在一次插入中获取实际的auto_increment值:

insert into tablename (name,rank) values ( 'bob',(SELECT AUTO_INCREMENT
FROM information_schema.tables
WHERE table_name = 'tablename'
AND table_schema = DATABASE( ) ) )

在这里查看更多信息 - 如何在MySQL中获取下一个自动增量ID


从性能角度来看,这比运行两个单独的查询更快吗?一个用于获取AI值,然后一个用于插入。 - Bxx
在MySQL中,读取一行信息比写入一行信息所需的资源要少,因此SELECT AUTO_INCREMENT ...应该比UPDATE tablename ...更快。 - mikl
6
这是否保证是原子性的? - mvorisek

4

last_insert_id()仅在插入操作完成后(无论成功与否)才会被设置。如果您尝试执行以下操作:

INSERT INTO yourtable (id, dupe_id) VALUES (null, last_insert_id())

希望 dupe_id 能够获得与 id 相同的 ID,然而……不行。在这个语句之前,last_insert_id() 将返回由任何先前运行的 insert 创建的 ID。
你需要执行以下操作(基本上):
INSERT ...;
UPDATE yourtable SET dupe_id=last_insert_id() WHERE id=last_insert_id();

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接