MYSQL:如何在不插入数据的情况下创建新行并获取新ID?

时间:2009-04-28 18:38:11

标签: mysql

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

感谢。

更新

好这是我的问题。我想要这样做的表只有1 ID列。 为什么? 我会解释(我们会尝试)。 我有另一个表,其中每一行都有自己唯一的ID variation_id(auto-inc),但每行需要绑定到同一个表中的一组其他行。我有另一个名为group_id的专栏,我不能将它自动包含在内,因为它需要多次出现,而是说它应该将哪些变体组合在一起。所以我想有一个第二个表,其中group_id作为主键和auto-inc,所以每当我需要一个新组时,我就可以使用它来生成新的group_id。我想我会以错误的方式解决这个问题......所以我该怎么办?

6 个答案:

答案 0 :(得分:11)

这是一个例子:

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

希望它有所帮助!

答案 1 :(得分:2)

您的所有列都必须是可为空的,并且您必须为ID以外的所有其他列插入null。

答案 2 :(得分:2)

你不能传递空值,还是我误解了这个问题?然后查询将成为:

INSERT INTO tableName values (null)

如果您的表格不接受空值,则可以使用默认值进行设置,这样您就可以执行以下查询:

INSERT INTO tableName VALUES (default) 

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

编辑:由于其他答案已到达,并且没有人提到默认关键字ID,以显示如何使用默认值创建表格。它是这样的:

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

现在,如果您愿意,只需执行以下操作即可插入ID的默认值:

INSERT INTO tableName (foo) values ('bar')

答案 3 :(得分:2)

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()为该组分配值。预先计算auto_increment值是非常危险的,并且最终会导致重复的组ID - 这可能是从非常烦人到致命的任何事情 - 取决于您的应用程序正在做什么。

答案 4 :(得分:0)

需要更多详细信息才能回答,但是,如果表中的所有列都可以为空,那么您只需插入一个空行并返回自动生成的ID。

答案 5 :(得分:0)

然后需要为每个列创建一个包含accept null的表布局,并且只需插入空值。

如果只需要id,请锁定表,从该表中选择max(id)并添加1.使用信息并使用新行并释放锁。