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

2022-08-31 00:50:00

我正在处理一些遗留代码/数据库,并且需要向数据库中添加一个字段,该字段将记录与该(外部)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       ...

请注意,该序列与帐户相关。

有没有办法在SQL中实现这一点,或者我求助于PHP脚本来为我完成工作?

TIA, Kev


答案 1

创建触发器:

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;

答案 2

这个问题被标记为“mysql”,所以是的,MySQL auto_increment可以创建按组顺序id。
请参阅 http://dev.mysql.com/doc/refman/5.0/en/example-auto-increment.html

对于 MyISAMBDB 表,您可以在多列索引中的辅助列上指定AUTO_INCREMENT。在这种情况下,AUTO_INCREMENT列的生成值计算为 。当您想要将数据放入有序组中时,这很有用。MAX(auto_increment_column) + 1 WHERE prefix=given-prefix

编辑:示例php脚本(使用PDO,但它与php-mysql模块的游戏相同)

$pdo = new PDO('mysql:host=...;dbname=...', '...', '...'); 
$pdo->setAttribute( PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION );

// example table
$pdo->exec(
  'CREATE TEMPORARY TABLE Foo (
    id int auto_increment,
    account int,
    someotherstuff varchar(32),
    primary key(account,id)
  ) engine=MyIsam'
);
// insert example data
$stmt = $pdo->prepare('INSERT INTO Foo (account,someotherstuff) VALUES (?,?)');
$stmt->execute(array(1, '1a'));
$stmt->execute(array(1, '1b'));
$stmt->execute(array(1, '1c'));
$stmt->execute(array(2, '2a'));
$stmt->execute(array(2, '2b'));
$stmt->execute(array(1, '1d'));
unset($stmt);

// query data
foreach( $pdo->query('SELECT account,id,someotherstuff FROM Foo') as $row ) {
  echo $row['account'], ' ', $row['id'], ' ', $row['someotherstuff'], "\n";
}

指纹

1 1 1a
1 2 1b
1 3 1c
2 1 2a
2 2 2b
1 4 1d

推荐