Создание «вторичного идентификатора» в MySQL - PullRequest
2 голосов
/ 07 декабря 2009

У меня есть таблица, которая хранит «записи» и уже имеет первичный ключ.

Table A
=======
id (INT) PK auto_increments
project_id (INT)
record_text (TEXT)

В этой таблице хранятся "записи" для всех моих проектов. Желательно иметь вторичный ключ, который автоматически увеличивается для проектов.

Пример: если у проекта 1 были идентификаторы (1,5,8,9) . Хотелось бы сохранить их и представить их пользователю как (1,2,3,4) .

У меня нет возможности использовать СДЕЛКИ, и мне трудно придумать способ сделать это, не вызывая проблем с параллелизмом.

Надеюсь, я ясно изложил свою проблему. Заранее благодарю за помощь.

Редактировать (пример): Предполагая структуру:
id, project_id, текст записи
1 1 тестирование
2 1 тестирование
3 2 испытания
4 1 тестирование

Мои ID для проекта 1 будут 1,2,4. Но я ищу способ сохранить и отобразить их для проекта 1 как 1,2,3

Ответы [ 4 ]

1 голос
/ 07 декабря 2009

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

Если вы действительно хотите сохранить его в БД, я бы рассмотрел использование триггера, который срабатывает на INSERTED, и устанавливает ваше значение там.

1 голос
/ 07 декабря 2009

Вы можете генерировать номера строк, используя переменные MySQL:

select
    id
,   project_id
,   if (@last_id = project_id, @n, @n := @n + 1) as RunningProjId
,   record_text
,   @last_id := project_id
from (select @n := 0, @last_id := -1) r, A
order by project_id

Строка с if увеличивает переменную @n, если проект отличается от последней строки. Это зависит от условия order by для работы. Строка с `` @last_id: = project_id saves the project_id` для ссылки при выборе следующей строки.

Первая часть предложения from - это инициализация переменной. Вторая часть вашего стола называется A.

0 голосов
/ 08 декабря 2009

Я не уверен, о чем я думал, возможно, слишком поздно, но я смог добиться этого, добавив столбец в таблицу:

id, pid, project_id, record_text

pid - система нумерации проекта.

ВСТАВКА:

INSERT INTO A (id, pid, project_id, record_text) 
VALUES (
    NULL, 
    (SELECT COALESCE(new_id, 0) + 1 FROM (SELECT MAX(new_id) AS new_id FROM atest WHERE project_id = 1) AS x),
    1,
    'some text'
);

Теперь, когда мой проект меняет мой pid, идентификатор зависит от проекта, также выполняется автоинкремент:

id    pid    project_id    record_text
1     1      1             testing 123
2     2      1             testing 123
3     1      2             testing 123
4     3      1             testing 123

Спасибо всем за ваш вклад, и я прошу прощения за плохое описание проблемы.

0 голосов
/ 07 декабря 2009

Вы можете также создать свое поле project_id для auto_increment , не делая его ключом.

...