Frage

Ich arbeite an einigen Legacy-Code / Datenbank und müssen ein Feld der Datenbank hinzuzufügen, die eine Sequenznummer zu, dass (ausländische) id Zusammenhang aufnehmen wird.

Beispiel Tabellendaten (Strom):

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

Ich brauche eine sequenceid Spalte hinzufügen, die für jedes Konto separat erhöht, zu erreichen:

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

Beachten Sie, dass die Sequenz zu berücksichtigen verwandt ist.

Gibt es eine Weise, die ich dies in SQL erreichen kann, oder nicht zurückgreifen Ich an einen PHP-Skript, um den Job für mich zu tun?

TIA, Kev

War es hilfreich?

Lösung

Das sollte funktionieren, ist aber wahrscheinlich langsam:

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;

Ich habe die Tabelle ‚Test‘ genannt; offensichtlich muss das richtig eingestellt werden. Sie haben eine temporäre Tabelle verwenden, da MySQL werden Sie keine subselect aus derselben Tabelle lassen verwenden Sie aktualisieren.

Andere Tipps

Die Frage ist, wie "mysql" getaggt, also ja, MySQL auto_increment groupwise sequenzielle IDs erstellen können.
finden Sie unter http://dev.mysql.com/doc/ refman / 5.0 / de / example-auto-increment.html :

MyISAM und BDB Tabellen Sie AUTO_INCREMENT in einer Sekundärspalte in einer mehrspaltigen Index angeben. In diesem Fall wird der erzeugte Wert für die AUTO_INCREMENT Spalte als MAX(auto_increment_column) + 1 WHERE prefix=given-prefix berechnet. Dies ist nützlich, wenn Sie Daten setzen in geordneten Gruppen wollen.

edit: Beispiel PHP-Skript (mit PDO , aber es ist das gleiche Spiel mit dem php-mysql Modul)

$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";
}

druckt

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

Erstellen Sie einen Trigger:

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;
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top