Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/265.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php MySQL:基于另一个字段添加序列列_Php_Mysql_Sequence - Fatal编程技术网

Php MySQL:基于另一个字段添加序列列

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相关的序列号

当前数据表示例:

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;