Php MySQL:基于另一个字段添加序列列
我正在处理一些遗留代码/数据库,需要在数据库中添加一个字段,该字段将记录与该外来id相关的序列号 当前数据表示例:Php MySQL:基于另一个字段添加序列列,php,mysql,sequence,Php,Mysql,Sequence,我正在处理一些遗留代码/数据库,需要在数据库中添加一个字段,该字段将记录与该外来id相关的序列号 当前数据表示例: ID ACCOUNT some_other_stuff 1 1 ... 2 1 ... 3 1 ... 4 2 ... 5 2 ... 6 1 ... 我需要添加一个sequenceid
ID ACCOUNT some_other_stuff
1 1 ...
2 1 ...
3 1 ...
4 2 ...
5 2 ...
6 1 ...
我需要添加一个sequenceid列,该列分别为每个帐户递增,以实现:
ID ACCOUNT SEQ some_other_stuff
1 1 1 ...
2 1 2 ...
3 1 3 ...
4 2 1 ...
5 2 2 ...
6 1 4 ...
请注意,该序列与account相关
有没有一种方法可以在SQL中实现这一点,或者我需要借助PHP脚本来完成这项工作
蒂亚,
Kev这个问题被标记为mysql,因此是的,mysql的自动增量可以创建分组顺序ID。 见: 对于MyISAM和BDB表,可以在多列索引中的辅助列上指定自动增量。在这种情况下,自动增量列的生成值计算为MAXauto\u INCREMENT\u column+1,其中prefix=给定前缀。当您想要将数据放入有序的组中时,这非常有用。 编辑:使用php脚本示例,但与模块的游戏相同 印刷品
1 1 1a
1 2 1b
1 3 1c
2 1 2a
2 2 2b
1 4 1d
创建触发器:
CREATE TRIGGER trg_mytable_bi
BEFORE INSERT ON mytable
FOR EACH ROW
BEGIN
DECLARE nseq INT;
SELECT COALESCE(MAX(seq), 0) + 1
INTO nseq
FROM mytable
WHERE account = NEW.account;
SET NEW.seq = nseq;
END;
这应该是可行的,但可能很慢:
CREATE temporary table seq ( id int, seq int);
INSERT INTO seq ( id, seq )
SELECT id,
(SELECT count(*) + 1 FROM test c
WHERE c.id < test.id AND c.account = test.account) as seq
FROM test;
UPDATE test INNER join seq ON test.id = seq.id SET test.seq = seq.seq;
我称这个表为“测试”;显然,这需要正确设置。您必须使用临时表,因为MySQL不允许您从正在更新的同一个表中使用subselect。感谢您的回复,但最后我选择了上面的临时表解决方案。对于任何有混淆错误问题的人,请参阅此处关于在触发器中使用分隔符:感谢您的回复。抱歉-我应该指定表是innoDB。我最终选择了下面的临时表格解决方案,但非常感谢您的输入!干杯很好的解决方案。这是正确的答案。效果很好。
CREATE temporary table seq ( id int, seq int);
INSERT INTO seq ( id, seq )
SELECT id,
(SELECT count(*) + 1 FROM test c
WHERE c.id < test.id AND c.account = test.account) as seq
FROM test;
UPDATE test INNER join seq ON test.id = seq.id SET test.seq = seq.seq;