MySQL:別のフィールドに基づいてシーケンス列を追加します
質問
私はいくつかのレガシーコード/データベースに取り組んでおり、その(外部)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、 ケブ
解決
これは機能するはずですが、おそらく遅いでしょう:
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では、更新している同じテーブルのサブセレクトを使用できないため、一時テーブルを使用する必要があります。
他のヒント
質問には&quot; mysql&quot;というタグが付けられているため、はい、MySQLのauto_incrementはグループごとの連続IDを作成できます。
http://dev.mysql.com/doc/をご覧ください。 refman / 5.0 / en / example-auto-increment.html :
MyISAM および BDB テーブルの場合、複数列インデックスのセカンダリ列にAUTO_INCREMENTを指定できます。この場合、AUTO_INCREMENTカラムの生成値は、 MAX(auto_increment_column)+ 1 WHERE prefix = given-prefix
として計算されます。これは、データを順序付けられたグループに入れたいときに便利です。
edit: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
トリガーを作成します:
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;
所属していません StackOverflow