После проверки с OP в комментариях выяснилось, что OP, возможно, получил управляющие символы M в вашем файле, используйте tr -d '\r' < Input_file > temp_file && mv temp_file Input_file
, поместите фактическое имя вашего скрипта вместо Input_file и попробуйте эту команду, и тогда вам будет хорошо.
Если автоинкремента недостаточно для ваших нужд, вы можете создать механизм атомарной последовательности с помощью 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 фактически определялась, когда происходит выбор.
Не обработает ли это столбец MySQL Identity на таблице?
CREATE TABLE table_name ( id INTEGER AUTO_INCREMENT ПЕРВИЧНЫЙ КЛЮЧ Независимо от того, что вы делаете, оно должно быть быстрым и избегать проблем с блокировкой. Даже если вы увидели ошибку, вызванную блокировкой (маловероятно, если вы не перегружаете базу данных), вы можете просто вызвать ее во второй / третий раз.
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();
Мы игровая компания с большим количеством транзакций и нуждаемся в подобных решениях для наших нужд. Одной из особенностей последовательностей 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";