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

99 раз из 100 я буду использовать "возвращаемое значение".

Время от времени у меня будет функция, где другой тип не только позволяет мне сохранять объявление переменной, но и делать это способом, который на самом деле значительно разъясняет функцию. Обычно это происходит, когда я хотел бы назвать возвращаемое значение тем же как функцию так или иначе, и часто это рекурсивные функции; что-то о той конструкции предоставляет его неявной возвращаемой переменной. Однако тот сценарий чрезвычайно редок . Я не знаю, есть ли у меня какие-либо функции с помощью неявных возвращаемых переменных вообще в моем текущем проекте.

10
задан 21 October 2009 в 11:39
поделиться

3 ответа

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

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

6
ответ дан 3 December 2019 в 17:20
поделиться

Создайте триггер:

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;
9
ответ дан 3 December 2019 в 17:20
поделиться

Вопрос помечен как «mysql», поэтому да, MySQL auto_increment может создавать групповые последовательные идентификаторы
см. 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 = данный-префикс . Это полезно, когда вы хотите поместить данные в упорядоченные группы.

править: пример скрипта 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
8
ответ дан 3 December 2019 в 17:20
поделиться
Другие вопросы по тегам:

Похожие вопросы: