может неуникальный индекс позволяет избежать дублирования записей - PullRequest
0 голосов
/ 13 сентября 2018

У меня есть таблица, в которой я не могу создать первичный ключ, а также уникальную индексацию, причина в том, что таблица содержит данные о зарплате сотрудника, код сотрудника уникален, но поскольку коды оплаты различны, и каждый код оплаты связан с отдельным сотрудником Вот почему мы разрешаем дублирование записей.

Теперь проблема заключается в том, что данные о зарплате помещаются сторонним поставщиком в общую базу данных, и когда мы переносим данные о зарплате в нашу базу данных, то получается, что записи данных вставляются дважды или трижды.

например, предположим, что третья сторона выдвинула 5000 записей, теперь нам нужно извлечь эти 5000 записей в нашу базу данных, но в прошлом месяце произошло, что данные выбирались 3–4 раза, вместо 5000 получалось 20 000 записей, потому что это было просто у нас нет подтверждения в нашей таблице.

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

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

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

Вот некоторые данные

   SALARY_REPORT_ID EMP_NAME    EMP_CODE    PAY_CODE    PAY_CODE_NAME   AMOUNT  PAY_MODE    PAY_CODE_DESC   YYYYMM  REMARK  EMP_ID  PRAN_NUMBER PF_NUMBER   PRAN_NO ATTOFF_EMPCODE  REFERENCE_ID
    13488158    Mr. Javed Jafri 91559037    104     7427    1   HOUSE RENT ALLOW    201802      119     22782303        150025  1-268
    13488159    Mr. Javed Jafri 91559037    100     23885   3   BASIC PAY   201802      119     22782303        150025  1-268
    13488160    Mr. Javed Jafri 91559037    103     9590    1   DEARNESS ALLOW. 201802      119     22782303        150025  1-268
    13488161    Mr. Javed Jafri 91559037    100     191800  1   BASIC PAY   201802      119     22782303        150025  1-268
    13488162    Mr. Javed Jafri 91559037    303     40000   2   PF SUB-PAY(GPF) 201802      119     22782303        150025  1-268
    13488163    Mr. Javed Jafri 91559037    502     20  2   G.T.I.S.    201802      119     22782303        150025  1-268
    13488164    Mr. Javed Jafri 91559037    503     72  2   SCLIS   201802      119     22782303        150025  1-268
    13488165    Mr. Javed Jafri 91559037    999     69441   1   NET EARNING 201802      119     22782303        150025  1-268
    13488166    Mr. Javed Jafri 91559037    998     195692  2   GROSS DEDUCTION 201802      119     22782303        150025  1-268
    13488167    Mr. Javed Jafri 91559037    997     265133  1   GROSS EARNING   201802      119     22782303        150025  1-268
    13488168    Mr. Javed Jafri 91559037    134     16006   3   WAGE REVISION ARREARS   201802      119     22782303        150025  1-268
    13488169    Mr. Javed Jafri 91559037    108     400 1   CONVEYANCE ALLOWANCE    201802      119     22782303        150025  1-268
    13488170    Mr. Javed Jafri 91559037    134     16025   3   WAGE REVISION ARREARS   201802      119     22782303        150025  1-268
    13488171    Mr. Javed Jafri 91559037    506     600 2   GSLI(Board Employee)    201802      119     22782303        150025  1-268
    13488172    Mr. Javed Jafri 91559037    312     155000  2   INCOME TAX  201802      119     22782303        150025  1-268

Больше отступа enter image description here

Ответы [ 2 ]

0 голосов
/ 13 сентября 2018

Кажется, что уникальное ограничение, которое вы хотите, является составным ограничением для your_table(EMP_CODE,PAY_CODE);

Только вы не можете создать это ограничение, пока у вас есть повторяющиеся значения для этой комбинации столбцов. Так что вам нужно очистить данные. К счастью, Oracle может поддержать вас в этом упражнении.

Во-первых, вам нужно создать таблицу отчетов об исключениях (если у вас ее еще нет). Oracle определяет стандартную структуру для этой таблицы, поэтому вы (или ваш дружественный администратор баз данных) должны запустить этот скрипт: @$ORACLE_HOME/rdbms/admin/utlexcpt.sql.

Затем создайте ограничение:

alter table your_table 
    add constraint your_table_uk unique (EMP_CODE,PAY_CODE)
    exceptions into EXCEPTIONS;  -- or whatever you called your reporting

Это не удастся, но заполнит таблицу EXCEPTIONS ROWID для всех нарушающих строк. Теперь вы можете просмотреть таблицу и удалить все повторяющиеся строки.

Если вы считаете, что это может быть длительным упражнением, или - если это так, - вы не хотите удалять дубликаты, вам следует использовать опцию NOVALIDATE. Это по крайней мере предотвратит ухудшение ситуации. Чтобы это работало, вам нужно создать неуникальный индекс (EMP_CODE, PAY_CODE) перед добавлением ограничения. Когда вы добавляете уникальное ограничение, Oracle будет использовать существующий индекс для его принудительного применения без каких-либо проблем. Но мы не можем использовать опцию NOVALIDATE с уникальным индексом. Узнайте больше .

Но убедитесь, что вы можете очистить дубликаты!

0 голосов
/ 13 сентября 2018

Если я правильно понял ваш вопрос, то вам нужно создать уникальный индекс для нескольких столбцов (employee_id, pay_code).Вы должны найти комбинацию столбцов, которые должны быть уникальными, и создать индекс на основе этого.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...