Вставка новой записи в таблицу если id не AUTO_INCREMENT

alex-drob

Новичок
Вставка новой записи в таблицу если id не AUTO_INCREMENT

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

например таблица содержит два поля

id int и data int

я делал так
select max(id) from table
а потом отдельно
insert into ....

но в момент между выполнением запросов другая программа тоже вносит данные, и иногда появляются строки с одинаковыми id

как можно этого исбежать? может можно как то в запросе insert получит значение моле id и увеличить его?
 

alex-drob

Новичок
оказалость всё гораздо сложней)) Сторонняя программа сама увеличивает id на 1 каждой записи и получается что когда я вношу запись она если такое ID уже есть в таблице перезаписывает его своей строкой.
 

Wicked

Новичок
переписать ту часть программы, которая "увеличивает id на 1", на использование автоинкремента
 

prolis

Новичок
для совсем упёртых:)
PHP:
mysql_result($sql);
while ( mysql_errno() >0){
 mysql_result($sql);
}
 

Gas

может по одной?
Как вариант, можно создать триггер
кстати да, автоинкремент + триггер, но это сработает если "сторонняя программа" не использует дальше id вставленной записи, а то она себе думает одно (max(id)+1), а в mysql попало другое значение.

или лочить всю таблицу в скрипте.
Имхо, транзакции тут не спасут если эта "программа" не расчитывалась на работу с ними, её нельзя менять и по умолчанию стоит autocommit=on.
 

alex-drob

Новичок
Вообщем обьясню подробней о программе.
Программа Mangos игровой сервер, как он подробно усроен я не знаю, выяснил что:
Он все базы грузит в память и работает с ними в памяти, в базу не сразу вносит обновления а по команде пользователдя или 1 раз в несколько минут автосахронение в базу;
Он при включении берёт последний ID с таблицы и сам считает дальше следующии значения;
Работает он с этим ID так же в течении всей работы программы и не перечитывает с базы а наоборот в базе перезаписывает (т.е. если в базе поменять значение то он перезапишет обратно);
если я вставляю запись в базу то когда прога записывает в базу данные она перезаписывает эту строку.

делаю скрипт который за голоса на сервере автоматически рассылает бонусы, но проблемма в том что нужно сервер выключать чтоб бонусы начислились. А это уже не совсем автоматически))
 

alex-drob

Новичок
Не не вариант, при онлайне даж как ща у нас 100+ чел 1000 итемов за пару минут наберётся, а + 10000000 например то при рестарте начнёт с нового id писать так и цифры закончатся))
 

weregod

unserializer
> MaNGOS: the open source MMORPG server
может в академии что-нибудь подправить? ;)
 

alex-drob

Новичок
то есть мне нужно выучить C++ и переписать мангос?)
ну я вообщем то с C++ знаком не много, но я не думаю что так просто подправить будет, весь серв всё делает в памяти и иногда в базу сохраняет, так что скорей всего там не подправить а переписать пол серва придётся))
наверное выход только дописывать к серверу функцию новую, чтоб он брал и добавлял сам данные в таблицу с другой, которую заполнять уже самому, но это будет сложно...
 

prolis

Новичок
как вариант - не создавать, а например удваивать существующие айтемы в качестве бонусов
 

whirlwind

TDD infected, paranoid
alex-drob тебе решить надо или поболтать? я тебе второй раз предлагаю - сделай свои 2 запроса внутри транзакции.
 
Сверху