|
|
Регистрация Восстановить пароль |
Регистрация | Задать вопрос |
Заплачу за решение |
Новые сообщения |
Сообщения за день |
Расширенный поиск |
Правила |
Всё прочитано |
|
Опции темы | Поиск в этой теме |
15.03.2012, 14:44 | #1 |
Форумчанин
Регистрация: 17.02.2010
Сообщений: 399
|
Одновременное сохранение в базу данных
Добрый день всем. Суть такова: есть программа в ней ведется учет выплат для льготников (да и многое другое), база данных ms sql server, к примеру сидят несколько людей 10-20 человек забивают базу. в базе нету ключевых полей и id присваиваются самой программой. к примеру завели нового человека программа просчитала количество записей (к примеру 30000) и создала 30001 запись и id дала 30001. НО... иногда возникает такая ситуация когда 2 человека забили людей и ОДНОВРЕМЕННО нажали кнопку сохранить в итоге в базе появляются 2 разных человека с одинаковыми id. и к примеру потом в поиске нажимаешь Иванова поиск ее находит но когда заходишь в личную карточку человека там уже Петрова. получается такое перекрещивание. собственно вопрос как сделать так чтоб при одновременном нажатии "сохранить" не появлялись 2 записи с одинаковыми id ?
|
15.03.2012, 15:40 | #2 |
!=
Участник клуба
Регистрация: 08.09.2008
Сообщений: 1,751
|
Ответ на поверхности надо менять таблицу, и добавлять идентификатор.
Или делать составной ключ, в котором кроме номера будет присутствовать к примеру логин оператора, добавившего запись. Но всё равно таблицу надо менять. Последний раз редактировалось vovk; 15.03.2012 в 15:52. |
15.03.2012, 16:04 | #3 |
Старожил
Регистрация: 09.01.2008
Сообщений: 26,229
|
vovk, +100
|
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 |
Белик Виталий :)
Старожил
Регистрация: 23.07.2007
Сообщений: 57,097
|
А еще мои 5 коп.
Можно не пересоздавать таблицу, а просто сделать генератор или что еще лучше триггер с выборкой максимального последнего ID и инкрементированием его перед вставкой. Я лично так делал
I'm learning to live...
|
15.03.2012, 23:18 | #6 |
Старожил
Регистрация: 17.11.2010
Сообщений: 18,922
|
Триггер еще написать грамотно уметь нужно. Хотя мое предложение тоже не проще
Если бы архитекторы строили здания так, как программисты пишут программы, то первый залетевший дятел разрушил бы цивилизацию
|
15.03.2012, 23:24 | #7 | ||
Белик Виталий :)
Старожил
Регистрация: 23.07.2007
Сообщений: 57,097
|
Цитата:
Цитата:
Связки были (как бы без мата сказать то...) меганепрофессиональные. Я пробовал реконструировать таблицы, но потом просто запутался. А с другой стороны был когда-то проект на ФоксПро около 20 таблиц, тоже вовремя не сделал ключи, пришлось менять структуру, но Фокс к этому более приспособлен оказался - один скрипт и все стало красиво. (Это я так... лирику развел.)
I'm learning to live...
Последний раз редактировалось Stilet; 15.03.2012 в 23:28. |
||
19.03.2012, 08:50 | #8 |
Форумчанин
Регистрация: 17.02.2010
Сообщений: 399
|
ну в базе не так много таблиц думаю около 10 связанных и связываются они через kodind который уникальный для каждой записи и создается в программе. триггер врядли получится написать ибо я просто никогда не сталкивался с этим. если делать автоинкремент ну т.е. добавить в базу еще одно поле, то все равно в программе могут быть 2 одинаковых kodind но id разные у них будут. а так как все завязано именно на kodind безобразие продолжаться будет. менять всю структуру базы большое и неблагодарное дело. хз вот и думаю как бы похитрее сделать или в программе проверку какую нить сделать.
|
19.03.2012, 11:47 | #9 |
Старожил
Регистрация: 09.01.2008
Сообщений: 26,229
|
мы как-то давно на фоксе подобную проблему решили так:
заводится ЕЩЁ одна таблица. в ней находится название таблицы + очередной код. когда необходимо добавить запись происходит следующее. 1) лочим запись с нужной таблицей. (или ждём в цикле, если запись уже кем-то залочена) 2) забираем ID (его и будем использовать для новой записи) 3) записываем ID+1 в таблицу кодов. 4) разлочиваем запись. понятное дело, что это просто напросто реализация секвенса, который есть в любой нормальной СУБД... p.s. в программе перед вставкой новой записи дополнительно была проверка на то, что записи с таким ID ещё нет- на случай сбоев в таблице кодов или ручных "шалостей". Но это уже совсем другая история... p.p.s. если невозможно локировать запись средствами самой СУБД, вполне можно смоделировать ситуацию через дополнительное поле - поставил .true. - запись никто не трогает. убрал - поставил .false. - запись свободна. Хотя, конечно, это "костыли"... |
23.03.2012, 09:07 | #10 |
Форумчанин
Регистрация: 17.02.2010
Сообщений: 399
|
Большое спасибо всем принявшим участие в решении проблемы. Сделал как предложил Аватар. написал все скрипты в новую таблицу все село как надо и id не поменялись что самое главное. в принципе еще грабли остались но уже потихоньку разбираться сам буду.
|
Опции темы | Поиск в этой теме |
Похожие темы | ||||
Тема | Автор | Раздел | Ответов | Последнее сообщение |
Импорт в базу данных. | 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 |