我有一个存储“记录”的表,并且已经有主键。
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
答案 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
感谢大家的投入,对于我对问题的不良描述,我深表歉意。