2009-12-07 3 views
2

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

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

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

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

У меня нет возможности использовать ОПЕРАЦИИ, и у меня возникли проблемы с мыслью о способе сделать это, не вызывая проблем с параллелизмом.

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

Edit (пример): Предполагая структуру:
идентификатора, PROJECT_ID, запись текст
1 1 тестирование
-1 тестирование
3 2 испытания
-1 тестирование

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

+1

Я должен добавить, что я не хочу заменить «id» на новый номер. Либо дополнительное поле, либо второй стол для присоединения будут делать трюк. – ws0x9

+0

может быть "id_shown"? – namespaceform

ответ

0

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

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

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

+0

Я думаю, проблема, с которой он сталкивается, от удаления строк, а не от автоматического приращения. Первичный идентификатор, вероятно, автообновлен, но он не решит его проблему. Он говорит, что если у вас есть строки 1, 2, 3 и 4 и удалите строку 3, как вы можете отображать строки 1, 2, 4 как 1, 2, 3 и сохранять ссылку на этот номер. –

1

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

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

+0

Отметив комментарий Кроу, вам также понадобится создать что-то, чтобы изменить нумерацию в случае удалений. –

+0

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

+0

Можете ли вы рассказать о своих рассуждениях о наличии этой колонки? –

1

Вы можете генерировать номера строк с помощью переменных 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

Я попытался применить этот запрос, но 'RunningProjId' перенумеровал' project_id'. Я смотрю на нумерацию 'id'. Я возился с ним сейчас ... Кажется перспективным. – ws0x9

+0

Да, все, что я должен был сделать, это изменить @last_id = project_id до @last_id = id – ws0x9

+0

Забыл сказать это, но спасибо Andomar! – ws0x9

Смежные вопросы