MYSQL: как создать новую строку и получить новый идентификатор без вставки данных? - PullRequest
10 голосов
/ 28 апреля 2009

Обычно я получаю новый идентификатор, вставляя некоторые данные, и он создает новую строку и возвращает новый идентификатор. Но если я не хочу вставлять какие-либо данные, я просто хочу создать новую строку с новым идентификатором и получить новый идентификатор ... как я могу это сделать?

Спасибо.

UPDATE:

ОК. Вот моя проблема. Таблица, для которой я хотел сделать это, имеет только столбец с 1 идентификатором. Зачем? Я объясню (мы постараемся). У меня есть другая таблица, в которой каждая строка имеет свой уникальный идентификатор вариации_id (auto-inc), но каждая строка должна быть привязана к группе других строк из той же таблицы. У меня есть другой столбец с именем group_id. У меня не может быть этого авто-inc, потому что он должен появляться несколько раз, это то, что говорит, какие варианты следует сгруппировать вместе. Поэтому я хотел иметь вторую таблицу с group_id в качестве первичного ключа и auto-inc, чтобы я мог использовать ее для генерации нового group_id всякий раз, когда мне нужна новая группа. Я думаю, я поступаю неправильно ... так что мне делать?

Ответы [ 6 ]

11 голосов
/ 27 мая 2012

вот пример:

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

Вы увидите каждую строку с автоматическим идентификатором и отметкой времени.

Проверьте эту скрипку: http://sqlfiddle.com/#!2/9a344/2

Надеюсь, это поможет!

2 голосов
/ 28 апреля 2009

SHOW CREATE TABLE покажет вам внутреннее значение auto_increment, которое будет присвоено следующей вставленной строке. Обратите внимание, что вы должны , а не использовать это значение в следующих инструкциях, поскольку это значение может измениться в результате другой операции вставки в микросекунду, в которой вы его получили. Вы можете использовать LAST_INSERT_ID() в других запросах, если это соответствует вашим потребностям - LAST_INSERT_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> 

Изменить после уточнения вопроса:

Вам следует создавать таблицы, отражающие эту логику, и давать им собственные имена. Создайте таблицу под названием группы (или что-то более подходящее в зависимости от вашего приложения) и вставляйте новую запись каждый раз, когда вы хотите создать группу. Вы можете присвоить значения этой группе, используя LAST_INSERT_ID(). Предварительный расчет значений auto_increment очень опасен и в конечном итоге приведет к дублированию идентификаторов групп - которые могут быть чем угодно - от крайне раздражающего до фатального - в зависимости от того, что делает ваше приложение.

2 голосов
/ 28 апреля 2009

Не можете ли вы просто передать нулевые значения, или я неправильно понимаю вопрос? Запрос тогда станет:

INSERT INTO tableName values (null)

Если ваши таблицы не принимают нулевые значения, они могут быть установлены со значением по умолчанию, что позволяет выполнять следующий запрос:

INSERT INTO tableName VALUES (default) 

По умолчанию - это ключевое слово, которое явно указывает значение по умолчанию для столбца. MySQL позволяет указывать пустой список значений, если для всех столбцов задано значение по умолчанию: вставить в D-значения ()

Редактировать: поскольку другие ответы получены, и ни один из них не упомянул ключевое слово по умолчанию, я хотел бы показать, как вы создаете таблицы со значениями по умолчанию. Это выглядит так:

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

Теперь, если вы хотите, вы можете вставить значение по умолчанию для ID, выполнив только:

INSERT INTO tableName (foo) values ('bar')
2 голосов
/ 28 апреля 2009

Все ваши столбцы должны быть обнуляемыми, а для всех остальных столбцов вам нужно будет вставить ноль, кроме ID.

0 голосов
/ 28 апреля 2009

Затем необходимо иметь макет таблицы с accept null для каждого столбца и просто вставить нулевые значения.

Если вам нужен только идентификатор, заблокируйте таблицу, выберите max (id) из этой таблицы и добавьте 1. Используйте информацию, используйте новую строку и снимите блокировку.

0 голосов
/ 28 апреля 2009

Нужно больше подробностей, чтобы ответить, но, если все столбцы в таблице обнуляются, вы можете просто вставить пустую строку и получить автоматически сгенерированный идентификатор.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...