MySQL: генерировать Autokey, но использовать его для нескольких строк - PullRequest
0 голосов
/ 12 декабря 2011

У меня есть таблица mysql, в которой хранится сопоставление идентификатора с набором значений:

CREATE TABLE `mapping` (
  `ID` bigint(20) unsigned NOT NULL,
  `Value` int(11) NOT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

Эта таблица представляет собой список значений, а идентификатор строки выбирает набор, которому принадлежит это значение. Таким образом, идентификатор столбца уникален для каждого набора, но не уникален для каждой строки.

Я вставляю данные в таблицу, используя следующую инструкцию:

INSERT INTO `mapping`
SELECT 5, `value` FROM `set1`;

В этом примере я рассчитал и установил ID вручную на 5. Было бы здорово, если бы mysql мог установить этот идентификатор автоматически. Я знаю функцию автоключа, но ее использование не будет работать, поскольку все строки, вставленные с одним и тем же оператором вставки, должны иметь одинаковый идентификатор.

Таким образом, каждый оператор вставки должен генерировать новый идентификатор, а затем использовать его для всех вставленных строк. Есть ли способ сделать это?

Ответы [ 2 ]

1 голос
/ 12 декабря 2011

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

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

1 голос
/ 12 декабря 2011

Я не уверен в этом (я не уверен, является ли таблица блокировки хорошей идеей, я думаю, что это не так), но это может помочь:

lock tables `mapping` as m write, m as m1 read;

insert into m
select (select max(id) + 1 from m1), `value` from `set1`;

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