|
Как не допустить попадание дублей в таблицу БД?
|
|||
---|---|---|---|
#18+
Код: Код: pascal 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. 23.
Фишка в том, что в БД, в таблице T_CLIENTS, есть два клиента с одинаковыми сериями и номерами паспортов, но строка: Код: pascal 1.
Упорно выдаёт, что записей, удовлетворяющих SQL-запросу всего 1. В чем я ошибся? ... |
|||
:
Нравится:
Не нравится:
|
|||
02.06.2018, 15:41 |
|
Как не допустить попадание дублей в таблицу БД?
|
|||
---|---|---|---|
#18+
Logos300В чем я ошибся? Много в чём. Помимо всего прочего: RecordCount возвращает число записей, отфетченных на клиента. В твоём случае он никогда не вернёт число больше единицы. Posted via ActualForum NNTP Server 1.5 ... |
|||
:
Нравится:
Не нравится:
|
|||
02.06.2018, 16:28 |
|
Как не допустить попадание дублей в таблицу БД?
|
|||
---|---|---|---|
#18+
Logos300, Не страдай проверкой этого факта в клиенте, при таком подходе рано иди поздно появятся "два клиента с одинаковыми сериями и номерами паспортов" В таблице T_CLIENTS создай уникальный ключ по полям серия и номер паспорта ... |
|||
:
Нравится:
Не нравится:
|
|||
02.06.2018, 17:05 |
|
Как не допустить попадание дублей в таблицу БД?
|
|||
---|---|---|---|
#18+
Logos300, - Наверное лучше использовать параметризированные запросы; - функция Exists работает быстрее; - для контроля " попадание дублей в таблицу БД" - можно юзать связку триггер+исключения; - уникальный индекс по вашим двум полям также может помочь; ... |
|||
:
Нравится:
Не нравится:
|
|||
02.06.2018, 17:11 |
|
Как не допустить попадание дублей в таблицу БД?
|
|||
---|---|---|---|
#18+
Сначала запрос лучше всего отлаживать отдельно, в IBExpert например, и только потом переносить в приложение. Запрос вида Код: plsql 1.
Всегда, в любом случае, выдает единственную запись, в которой значение поля показывает сколько записей подходящих под условие найдено. В том числе и 0. Код: pascal 1.
выдает количество записей, возвращенных запросом, причем даже в этом есть еще масса тонкостей, в зависимости от ситуации. Что бы узнать сколько записей найдено, нужно прочитать значение поля. Код: pascal 1.
Собирать текст запроса в рантайме - некошерно. Например такой минус - если внутри текстового поля PassportSeria или PassportNumber оператор введет символ ' - запрос не выполнится, будет ошибка. Гораздо лучше пользоваться параметрами. В этом случае никаких проблем со значением параметров не будет. Код: plsql 1. 2. 3. 4.
Этот текст запроса прописать в свойство Query.SQL в дизайн-тайме, заполнять параметры вот так: Код: pascal 1. 2. 3. 4.
... |
|||
:
Нравится:
Не нравится:
|
|||
02.06.2018, 17:27 |
|
Как не допустить попадание дублей в таблицу БД?
|
|||
---|---|---|---|
#18+
AltHasp> - функция Exists работает быстрее; > - для контроля " попадание дублей в таблицу БД" - можно юзать связку триггер+исключения; > - уникальный индекс по вашим двум полям также может помочь; В обратном порядке. Сначала индекс, потом триггер, потом все остальные варианты проверок. Posted via ActualForum NNTP Server 1.5 ... |
|||
:
Нравится:
Не нравится:
|
|||
02.06.2018, 17:31 |
|
Как не допустить попадание дублей в таблицу БД?
|
|||
---|---|---|---|
#18+
Если в базе создать ограничение уникальности на такую комбинацию значений - то дубль вставить будет невозможно из любого приложения, проверяет оно на дубль или нет. Остается только грамотно поймать и отобразить попытку нарушения уникальности, что бы оператор понял в чем проблема. Код: plsql 1.
... |
|||
:
Нравится:
Не нравится:
|
|||
02.06.2018, 17:34 |
|
Как не допустить попадание дублей в таблицу БД?
|
|||
---|---|---|---|
#18+
AltHasp- для контроля " попадание дублей в таблицу БД" - можно юзать связку триггер+исключения; Это плохой метод, он не гарантирует отсутствие дублей. Триггер работает в контексте транзации - он может не видеть уже вставленную запись-дубль. AltHasp- уникальный индекс по вашим двум полям также может помочь; Это IMHO единственный надежный метод. Впрочем, эта надежность иногда мешает, ее не получится обойти, а реальный мир иногда может потребовать наличие дублей. Зависит от проектирования БД. ... |
|||
:
Нравится:
Не нравится:
|
|||
02.06.2018, 17:39 |
|
Как не допустить попадание дублей в таблицу БД?
|
|||
---|---|---|---|
#18+
Предполагаю, что ты ошибся в создании ограничений на таблицу, хранящую данные о серии и номере паспорта. ... |
|||
:
Нравится:
Не нравится:
|
|||
02.06.2018, 18:01 |
|
Как не допустить попадание дублей в таблицу БД?
|
|||
---|---|---|---|
#18+
fraks> Триггер работает в контексте транзации - он fraks> может не видеть уже вставленную запись-дубль. Это зависит от того, как транзакции запрограммировать. Posted via ActualForum NNTP Server 1.5 ... |
|||
:
Нравится:
Не нравится:
|
|||
02.06.2018, 18:45 |
|
Как не допустить попадание дублей в таблицу БД?
|
|||
---|---|---|---|
#18+
Гаджимурадов Рустамfraks> Триггер работает в контексте транзации - он fraks> может не видеть уже вставленную запись-дубль. Это зависит от того, как транзакции запрограммировать. Как ни программируй, а незакоммиченную запись все равно не увидеть. ... |
|||
:
Нравится:
Не нравится:
|
|||
02.06.2018, 19:07 |
|
Как не допустить попадание дублей в таблицу БД?
|
|||
---|---|---|---|
#18+
Незакоммиченную обычно и не надо. Posted via ActualForum NNTP Server 1.5 ... |
|||
:
Нравится:
Не нравится:
|
|||
02.06.2018, 19:49 |
|
Как не допустить попадание дублей в таблицу БД?
|
|||
---|---|---|---|
#18+
Гаджимурадов РустамНезакоммиченную обычно и не надо.Ну вот. Две транзакции не увидели одинаковой незакоммиченной записи, и вставили каждая такую. ... |
|||
:
Нравится:
Не нравится:
|
|||
02.06.2018, 19:54 |
|
Как не допустить попадание дублей в таблицу БД?
|
|||
---|---|---|---|
#18+
fraks, Код: pascal 1.
м.б. Код: pascal 1.
т.к. серии обычно содержать и символьные идентификатор ... |
|||
:
Нравится:
Не нравится:
|
|||
03.06.2018, 10:22 |
|
Как не допустить попадание дублей в таблицу БД?
|
|||
---|---|---|---|
#18+
AltHasp, смотря где и когда. это раньше серия была типа 4 НК ... А сейчас там только цифры. Тем не менее, с этим все равно бардак. РЖД сливает и серию и номер в одно "число", без пробелов. А на самом деле серия - 2 по 2 цифры. В общем, лучше смотреть какую-нибудь официальную спецификацию. ... |
|||
:
Нравится:
Не нравится:
|
|||
03.06.2018, 13:27 |
|
|
start [/forum/topic.php?fid=40&msg=39654389&tid=1561088]: |
0ms |
get settings: |
9ms |
get forum list: |
10ms |
check forum access: |
3ms |
check topic access: |
3ms |
track hit: |
131ms |
get topic data: |
9ms |
get forum data: |
2ms |
get page messages: |
45ms |
get tp. blocked users: |
1ms |
others: | 343ms |
total: | 556ms |
0 / 0 |