MYSQL:如何创建一个新行并获取新的ID而不插入数据?

11

通常我通过插入一些数据来获取新的ID,它会创建一个新行并返回新的ID。但如果我不想插入任何数据,只想创建一个带有新ID的新行并获取新ID...我该怎么做?

谢谢。

更新:

好的,这是我的问题。我想对它进行此操作的表只有1个ID列。

为什么?

我会解释(我会尝试)。我有另一个表,其中每行都有自己独特的ID变体(自动增加),但每行需要与同一表中的其他行相关联。我有另一列名为group_id,我不能让它自动增加,因为它需要多次出现,它表示应将哪些变量组合在一起。所以我想要有一个第二个表,其中group_id作为主键并自动增加,这样我就可以使用它来生成新的group_id,每当我需要一个新的组时。我想我走错了路...那我该怎么办呢?


你为什么要尝试这样做?也许有更好的解决方案来解决你最初的问题。 - Ben S
因为这就是表的全部目的,没有其他列。 - JD Isaacks
根据答案,我认为我需要解释我的问题并寻找替代答案。 - JD Isaacks
@d03boy,我已经假定我走了错误的路,这就是为什么我来这里寻求帮助的原因。你的评论没有帮助。 - JD Isaacks
6个回答

13

以下是一个例子:

CREATE TABLE X (id int PRIMARY KEY AUTO_INCREMENT);

然后您可以使用以下方式为表格添加数据:

INSERT INTO X (id) VALUES (NULL);
SELECT LAST_INSERT_ID();

查看这个示例:http://sqlfiddle.com/#!2/6b19c/1

希望对你有所帮助!

Тарас Лукавий问了另一个问题,这里是答案:

CREATE TABLE X (id int PRIMARY KEY AUTO_INCREMENT, time timestamp);

然后你可以使用以下代码“提供”数据:

INSERT INTO X (id, time) VALUES (NULL, now());
SELECT LAST_INSERT_ID();

现在,让我们来检查一下:

SELECT * FROM X

你将会看到每一行都有自动的id和时间戳。

查看这个示例: http://sqlfiddle.com/#!2/9a344/2

希望能对你有所帮助!


2
+1 做得好!请注意,您还可以插入DEFAULT值而不是NULL以获得相同的效果-在我看来,这使代码更清晰。此外,由于时间戳列在任何更改时都会自动更新,因此无需手动插入now()。以下是一个示例:http://sqlfiddle.com/#!2/5f193/1 - Paul Bellora
1
这就是为什么我喜欢stackoverflow。即使我们帮助别人,我们也可以从更有经验的用户那里学到新东西!谢谢@Paul Bellora,我不知道DEFAULT值!还有更多东西要学习!kkkk - pcsi
我正在为如何在脑海中读取Тарас Лукавий而感到困惑...每当我扫过它时,我总是想到“zoyyyy”。 - Ben

3

SHOW CREATE TABLE将显示下一个插入行将分配的内部auto_increment值。请注意,您不应在后续语句中使用该值,因为该值可能会在您接收到它的微秒内通过不同的插入操作更改。如果适合您的需求,您可以在其他查询中使用LAST_INSERT_ID() - LAST_INSERT_ID()将为您提供在此会话(=连接)中插入的最后一个ID,因此可以放心依赖该值。

mysql> CREATE TEMPORARY TABLE test (id INT PRIMARY KEY AUTO_INCREMENT);
Query OK, 0 rows affected (0.00 sec)

mysql> show create table test;
+-------+--------------------------------------------------------------------------------------------------------------------------------------+
| Table | Create Table                                                                                                                         |
+-------+--------------------------------------------------------------------------------------------------------------------------------------+
| test  | CREATE TEMPORARY TABLE `test` (
  `id` int(11) NOT NULL auto_increment,
  PRIMARY KEY  (`id`)
) ENGINE=MyISAM DEFAULT CHARSET=latin1 | 
+-------+--------------------------------------------------------------------------------------------------------------------------------------+
1 row in set (0.00 sec)

mysql> INSERT INTO test(id) VALUES(10);
Query OK, 1 row affected (0.00 sec)

mysql> show create table test;
+-------+--------------------------------------------------------------------------------------------------------------------------------------------------------+
| Table | Create Table                                                                                                                                           |
+-------+--------------------------------------------------------------------------------------------------------------------------------------------------------+
| test  | CREATE TEMPORARY TABLE `test` (
  `id` int(11) NOT NULL auto_increment,
  PRIMARY KEY  (`id`)
) ENGINE=MyISAM AUTO_INCREMENT=11 DEFAULT CHARSET=latin1 | 
+-------+--------------------------------------------------------------------------------------------------------------------------------------------------------+
1 row in set (0.00 sec)

mysql> 

编辑问题澄清后:

您应该创建反映逻辑并给它们适当名称的表。创建一个名为“groups”的表(或根据您的应用程序选择更好的名称),每次想要生成组时插入一个新条目。您可以通过使用其LAST_INSERT_ID()来为该组分配值。预先计算自动增量值非常危险,并最终会导致重复的组ID - 这可能是极其恼人的,也可能是致命的 - 具体取决于您的应用程序正在执行什么操作。


2
你能不能只传递 null 值,或者我理解有误?查询语句将变为:
INSERT INTO tableName values (null)

如果你的表不接受空值,可以设置默认值,这样你就能执行以下查询:

INSERT INTO tableName VALUES (default) 

Default是一个关键字,显式指定列的默认值。如果所有列都定义了默认值,则MySQL允许您指定空值列表:insert into D values()

编辑:由于其他答案已经到达并且没有提到默认关键字,我想展示如何创建带有默认值的表。操作如下:

CREATE TABLE tableName (id integer default 0, foo varchar(10))

现在,如果你想的话,只需执行以下操作即可插入ID的默认值:
INSERT INTO tableName (foo) values ('bar')

谢谢您的回答,我更新了我的问题,请查看更新。谢谢! - JD Isaacks

2

你的所有列都必须可为空,并且在除了ID之外的所有其他列中插入null。


如果ID列是唯一的列,那该怎么办? - JD Isaacks
为什么你会有一个只包含ID的表?能否提供一些上下文——这似乎是一个奇怪的设计。 - Parrots

0
需要更多细节才能回答,但如果表中的所有列都可为空,则可以插入一个空行并获取自动生成的ID。

0
需要使用一个具有每个列接受空值并只插入空值的表格布局。
如果仅需要ID,请锁定该表,选择该表中的max(id),然后加1。使用信息消耗新行并释放锁定。

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