通常我会通过插入一些数据来获取新ID,然后创建一个新行并返回新ID。但是,如果我不想插入任何数据,我只想创建一个带有新ID的新行并获取新ID ...我该怎么做?
感谢。
更新
好这是我的问题。我想要这样做的表只有1 ID列。 为什么? 我会解释(我们会尝试)。 我有另一个表,其中每一行都有自己唯一的ID variation_id(auto-inc),但每行需要绑定到同一个表中的一组其他行。我有另一个名为group_id的专栏,我不能将它自动包含在内,因为它需要多次出现,而是说它应该将哪些变体组合在一起。所以我想有一个第二个表,其中group_id作为主键和auto-inc,所以每当我需要一个新组时,我就可以使用它来生成新的group_id。我想我会以错误的方式解决这个问题......所以我该怎么办?
答案 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.使用信息并使用新行并释放锁。