Question

Je travaille sur un code / une base de données hérité (e), et j'ai besoin d'ajouter un champ à la base de données qui enregistrera un numéro de séquence associé à cet identifiant (étranger).

Exemple de données de table (en cours):

ID     ACCOUNT     some_other_stuff
1      1           ...
2      1           ...
3      1           ...
4      2           ...
5      2           ...
6      1           ...

Je dois ajouter une colonne sequenceid qui s'incrémente séparément pour chaque compte, pour obtenir:

ID     ACCOUNT     SEQ     some_other_stuff
1      1           1       ...
2      1           2       ...
3      1           3       ...
4      2           1       ...
5      2           2       ...
6      1           4       ...

Notez que la séquence est liée au compte.

Existe-t-il un moyen de réaliser cela en SQL ou dois-je recourir à un script PHP pour faire le travail pour moi?

TIA, Kev

Était-ce utile?

La solution

Cela devrait fonctionner mais est probablement lent:

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;

J'ai appelé la table 'test'; évidemment cela doit être réglé correctement. Vous devez utiliser une table temporaire car MySQL ne vous laissera pas utiliser une sous-sélection de la même table que vous mettez à jour.

Autres conseils

La question est étiquetée "mysql", alors oui, l'auto-incrémentation de MySQL peut créer des identifiants séquentiels par groupe.
voir http://dev.mysql.com/doc/ refman / 5.0 / fr / example-auto-increment.html :

Pour les tables MyISAM et BDB , vous pouvez spécifier AUTO_INCREMENT sur une colonne secondaire dans un index à plusieurs colonnes. Dans ce cas, la valeur générée pour la colonne AUTO_INCREMENT est calculée comme suit: MAX (auto_increment_column) + 1 préfixe WHERE = done-prefix . Ceci est utile lorsque vous souhaitez placer des données dans des groupes ordonnés.

modifier: exemple de script php (avec PDO , mais le jeu est identique avec le module 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";
}

imprime

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

Créez un déclencheur:

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;
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top