Эмуляция безопасной от транзакции ПОСЛЕДОВАТЕЛЬНОСТИ в MySQL

После проверки с OP в комментариях выяснилось, что OP, возможно, получил управляющие символы M в вашем файле, используйте tr -d '\r' < Input_file > temp_file && mv temp_file Input_file, поместите фактическое имя вашего скрипта вместо Input_file и попробуйте эту команду, и тогда вам будет хорошо.

10
задан Michael Pliskin 30 April 2009 в 07:42
поделиться

4 ответа

Если автоинкремента недостаточно для ваших нужд, вы можете создать механизм атомарной последовательности с помощью n именованные последовательности вроде этого:

Создайте таблицу для хранения ваших последовательностей:

CREATE TABLE sequence (
  seq_name varchar(20) unique not null,
  seq_current unsigned int not null
);

Предполагая, что у вас есть строка для 'foo' в таблице, вы можете атомарно получить следующий идентификатор последовательности следующим образом:

UPDATE sequence SET seq_current = (@next := seq_current + 1) WHERE seq_name = 'foo';
SELECT @next;

Блокировки не требуются. Оба оператора должны выполняться в одном сеансе, чтобы локальная переменная @next фактически определялась, когда происходит выбор.

15
ответ дан 3 December 2019 в 15:22
поделиться

Не обработает ли это столбец MySQL Identity на таблице?

CREATE TABLE table_name ( id INTEGER AUTO_INCREMENT ПЕРВИЧНЫЙ КЛЮЧ Независимо от того, что вы делаете, оно должно быть быстрым и избегать проблем с блокировкой. Даже если вы увидели ошибку, вызванную блокировкой (маловероятно, если вы не перегружаете базу данных), вы можете просто вызвать ее во второй / третий раз.

0
ответ дан 3 December 2019 в 15:22
поделиться

The right way to do this is given in the MySQL manual:

UPDATE child_codes SET counter_field = LAST_INSERT_ID(counter_field + 1);
SELECT LAST_INSERT_ID();
9
ответ дан 3 December 2019 в 15:22
поделиться

Мы игровая компания с большим количеством транзакций и нуждаемся в подобных решениях для наших нужд. Одной из особенностей последовательностей Oracle было также значение инкремента, которое также можно было задавать.

В решении используется DUPLICATE KEY.

CREATE TABLE sequences (
  id BIGINT DEFAULT 1,
  name CHAR(20),
  increment TINYINT,
  UNIQUE KEY(name)
);

Чтобы получить следующий индекс:

Абстрагируйте следующее с помощью хранимой процедуры или функции sp_seq_next_val(VARCHAR):

INSERT INTO sequences (name) VALUES ("user_id") ON DUPLICATE KEY UPDATE id = id + increment;<br/>
SELECT id FROM sequences WHERE name = "user_id";
5
ответ дан 3 December 2019 в 15:22
поделиться
Другие вопросы по тегам:

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