MySQL - сервер:Добавить столбец последовательности на основе другого поля

StackOverflow https://stackoverflow.com/questions/1600294

  •  05-07-2019
  •  | 
  •  

Вопрос

Я работаю над некоторым устаревшим кодом / базой данных, и мне нужно добавить в базу данных поле, в котором будет записан порядковый номер, связанный с этим (внешним) идентификатором.

Пример табличных данных (текущих):

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-скрипту, который сделает эту работу за меня?

ТИА, Кев

Это было полезно?

Решение

Это должно сработать, но, вероятно, медленно:

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 не позволит вам использовать подвыборку из той же таблицы, которую вы обновляете.

Другие советы

Вопрос помечен как "mysql", так что да, auto_increment MySQL может создавать последовательные идентификаторы groupwise.
видишь http://dev.mysql.com/doc/refman/5.0/en/example-auto-increment.html:

Для МиИСАМ и БДБ таблицы вы можете указать АВТО_ИНКРЕМЕНТ для дополнительного столбца в многоколоночном индексе.В этом случае сгенерированное значение для столбца AUTO_INCREMENT вычисляется как MAX(auto_increment_column) + 1 WHERE prefix=given-prefix.Это полезно, когда вы хотите распределить данные по упорядоченным группам.

Редактировать:пример php-скрипта (с использованием PDO ( 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;
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top