Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > IT форум > Общие вопросы по программированию, компьютерный форум
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 15.03.2012, 14:44   #1
wm_leviathan
Форумчанин
 
Аватар для wm_leviathan
 
Регистрация: 17.02.2010
Сообщений: 399
По умолчанию Одновременное сохранение в базу данных

Добрый день всем. Суть такова: есть программа в ней ведется учет выплат для льготников (да и многое другое), база данных ms sql server, к примеру сидят несколько людей 10-20 человек забивают базу. в базе нету ключевых полей и id присваиваются самой программой. к примеру завели нового человека программа просчитала количество записей (к примеру 30000) и создала 30001 запись и id дала 30001. НО... иногда возникает такая ситуация когда 2 человека забили людей и ОДНОВРЕМЕННО нажали кнопку сохранить в итоге в базе появляются 2 разных человека с одинаковыми id. и к примеру потом в поиске нажимаешь Иванова поиск ее находит но когда заходишь в личную карточку человека там уже Петрова. получается такое перекрещивание. собственно вопрос как сделать так чтоб при одновременном нажатии "сохранить" не появлялись 2 записи с одинаковыми id ?
wm_leviathan вне форума Ответить с цитированием
Старый 15.03.2012, 15:40   #2
vovk
!=
Участник клуба
 
Аватар для vovk
 
Регистрация: 08.09.2008
Сообщений: 1,751
По умолчанию

Ответ на поверхности надо менять таблицу, и добавлять идентификатор.
Или делать составной ключ, в котором кроме номера будет присутствовать к примеру логин оператора, добавившего запись.
Но всё равно таблицу надо менять.

Последний раз редактировалось vovk; 15.03.2012 в 15:52.
vovk вне форума Ответить с цитированием
Старый 15.03.2012, 16:04   #3
Serge_Bliznykov
Старожил
 
Регистрация: 09.01.2008
Сообщений: 26,229
По умолчанию

vovk, +100
Serge_Bliznykov вне форума Ответить с цитированием
Старый 15.03.2012, 20:04   #4
Аватар
Старожил
 
Аватар для Аватар
 
Регистрация: 17.11.2010
Сообщений: 18,922
По умолчанию

Можно и не добавлять новое поле, а это сделать автоинкриментным. Для этого
1. полечить таблицу, избавившись от дубликатов в этом поле
2. содать новую с другим именем той же структуры, но поле id автоинкриментное
3. сделать SET IDENTITY_INSERT ON для новой таблицы
4. перегнать данные из старой таблицы в новую
5. сделать SET IDENTITY_INSERT OFF для новой таблицы
6. удалить старую таблицу
7. новую переименовать
8. в программе заполнения не заполнять id. Оно автоматически будет создаваться уникальным
Если бы архитекторы строили здания так, как программисты пишут программы, то первый залетевший дятел разрушил бы цивилизацию
Аватар вне форума Ответить с цитированием
Старый 15.03.2012, 22:28   #5
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

А еще мои 5 коп.
Можно не пересоздавать таблицу, а просто сделать генератор или что еще лучше триггер с выборкой максимального последнего ID и инкрементированием его перед вставкой.
Я лично так делал
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 15.03.2012, 23:18   #6
Аватар
Старожил
 
Аватар для Аватар
 
Регистрация: 17.11.2010
Сообщений: 18,922
По умолчанию

Триггер еще написать грамотно уметь нужно. Хотя мое предложение тоже не проще
Если бы архитекторы строили здания так, как программисты пишут программы, то первый залетевший дятел разрушил бы цивилизацию
Аватар вне форума Ответить с цитированием
Старый 15.03.2012, 23:24   #7
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

Цитата:
Триггер еще написать грамотно уметь нужно
Ну да... С этим не поспоришь.

Цитата:
Хотя мое предложение тоже не проще
Кстати оно не проще, если такая беда во всей базе, скажем так мне довелось видеть подобное в БД о 100 с чем-то таблицах.
Связки были (как бы без мата сказать то...) меганепрофессиональные. Я пробовал реконструировать таблицы, но потом просто запутался.
А с другой стороны был когда-то проект на ФоксПро около 20 таблиц, тоже вовремя не сделал ключи, пришлось менять структуру, но Фокс к этому более приспособлен оказался - один скрипт и все стало красиво. (Это я так... лирику развел.)
I'm learning to live...

Последний раз редактировалось Stilet; 15.03.2012 в 23:28.
Stilet вне форума Ответить с цитированием
Старый 19.03.2012, 08:50   #8
wm_leviathan
Форумчанин
 
Аватар для wm_leviathan
 
Регистрация: 17.02.2010
Сообщений: 399
По умолчанию

ну в базе не так много таблиц думаю около 10 связанных и связываются они через kodind который уникальный для каждой записи и создается в программе. триггер врядли получится написать ибо я просто никогда не сталкивался с этим. если делать автоинкремент ну т.е. добавить в базу еще одно поле, то все равно в программе могут быть 2 одинаковых kodind но id разные у них будут. а так как все завязано именно на kodind безобразие продолжаться будет. менять всю структуру базы большое и неблагодарное дело. хз вот и думаю как бы похитрее сделать или в программе проверку какую нить сделать.
wm_leviathan вне форума Ответить с цитированием
Старый 19.03.2012, 11:47   #9
Serge_Bliznykov
Старожил
 
Регистрация: 09.01.2008
Сообщений: 26,229
По умолчанию

мы как-то давно на фоксе подобную проблему решили так:
заводится ЕЩЁ одна таблица. в ней находится название таблицы + очередной код.
когда необходимо добавить запись происходит следующее.
1) лочим запись с нужной таблицей. (или ждём в цикле, если запись уже кем-то залочена)
2) забираем ID (его и будем использовать для новой записи)
3) записываем ID+1 в таблицу кодов.
4) разлочиваем запись.
понятное дело, что это просто напросто реализация секвенса, который есть в любой нормальной СУБД...

p.s. в программе перед вставкой новой записи дополнительно была проверка на то, что записи с таким ID ещё нет- на случай сбоев в таблице кодов или ручных "шалостей". Но это уже совсем другая история...

p.p.s. если невозможно локировать запись средствами самой СУБД, вполне можно смоделировать ситуацию через дополнительное поле - поставил .true. - запись никто не трогает. убрал - поставил .false. - запись свободна. Хотя, конечно, это "костыли"...
Serge_Bliznykov вне форума Ответить с цитированием
Старый 23.03.2012, 09:07   #10
wm_leviathan
Форумчанин
 
Аватар для wm_leviathan
 
Регистрация: 17.02.2010
Сообщений: 399
По умолчанию

Большое спасибо всем принявшим участие в решении проблемы. Сделал как предложил Аватар. написал все скрипты в новую таблицу все село как надо и id не поменялись что самое главное. в принципе еще грабли остались но уже потихоньку разбираться сам буду.
wm_leviathan вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Импорт в базу данных. Kasper1 PHP 6 22.02.2011 20:09
Сохранение изменений в базу данных. Моряк007 БД в Delphi 8 27.06.2010 16:51
Создать базу данных Master of Puppets Microsoft Office Excel 5 10.06.2008 13:34
Сохранение нескольких записей из DbGrid в базу Canadec БД в Delphi 5 06.09.2007 14:26