在mysql中创建“辅助ID”

时间:2009-12-07 19:35:32

标签: mysql transactions indexing

我有一个存储“记录”的表,并且已经有主键。

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

此表存储我所有项目的“记录”。希望有一个为项目自动递增的辅助密钥。

示例:如果项目1的id为(1,5,8,9)。最好将它们存储起来并以(1,2,3,4)的形式呈现给用户。

我没有能力使用TRANSACTIONS而且我无法在不引起并发问题的情况下考虑这样做。

希望我明白我的问题。提前感谢您的帮助。

编辑(示例): 假设结构:
id,project_id,记录文本
    1 1测试
    2 1测试
    3 2测试
    4 1测试

项目1的ID为1,2,4。但我正在寻找一种方法来存储和显示项目1的1,2,3

4 个答案:

答案 0 :(得分:1)

我无法从您的问题中判断出来,但是如果您只想向用户提供一个编号清晰的列表;我会在UI中处理这个问题;甚至不用担心将其存储在数据库中。

如果你真的想将它存储在数据库中,我会考虑使用在INSERTED上触发的触发器,并在那里设置你的值。

答案 1 :(得分: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

答案 2 :(得分:0)

您可以将 project_id 字段创建为 auto_increment ,而不必将其作为密钥。

答案 3 :(得分:0)

我不确定我在想什么,可能在当天太晚了,但我能够通过在表格中添加一列来实现这一目标:

id, pid, project_id, record_text

pid是项目的编号系统。

INSERT:

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,自动增量:

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

感谢大家的投入,对于我对问题的不良描述,我深表歉意。