Запрос для поиска таблиц без уникальных ключей - PullRequest
2 голосов
/ 11 декабря 2019

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

Ответы [ 3 ]

2 голосов
/ 11 декабря 2019

Используйте поле UNIQUENESS из таблицы ALL_INDEXES.

SELECT atc.table_name, atc.column_Name
FROM ALL_INDEXES ai
INNER JOIN ALL_IND_COLUMNS aic ON ai.OWNER = aic.INDEX_OWNER AND ai.INDEX_NAME = aic.INDEX_NAME
INNER JOIN ALL_TAB_COLUMNS atc ON atc.owner = col.table_owner AND atc.table_name = aic.table_name AND atc.column_Name = aic.column_Name
WHERE UNIQUENESS != 'UNIQUE';
0 голосов
/ 11 декабря 2019

Вы можете использовать:

select distinct t.table_name
  from user_tables t
 where not exists 
       ( select 0
           from user_constraints c
          where regexp_like(c.constraint_type,'u|p','i')
            and t.table_name = c.table_name )

или

select t.table_name
  from user_constraints c
 right join user_tables t
    on t.table_name = c.table_name
 group by t.table_name
having sum( case
            when c.constraint_type in ('U', 'P') then
               1
            else
               0
            end ) = 0

только для текущего пользователя.

Для всей базы данных заменить user_ с dba_ для имен представлений.

0 голосов
/ 11 декабря 2019

Следующий запрос найдет все таблицы в вашей зарегистрированной схеме, которые не имеют ограничения PRIMARY или UNIQUE:

SELECT DISTINCT TABLE_NAME
  FROM (SELECT t.TABLE_NAME
          FROM USER_TABLES t
          WHERE t.TABLE_NAME NOT IN (SELECT DISTINCT u.TABLE_NAME
                                       FROM USER_CONSTRAINTS u
                                       WHERE u.CONSTRAINT_TYPE IN ('U', 'P')) AND
                t.TABLE_NAME NOT IN (SELECT i.TABLE_NAME
                                       FROM USER_INDEXES i
                                       WHERE i.UNIQUENESS = 'UNIQUE'))
  ORDER BY TABLE_NAME

Если вы хотите найти все таблицы вбаза данных , в которой отсутствует первичный или уникальный ключ, который вы можете использовать

SELECT DISTINCT OWNER, TABLE_NAME
  FROM (SELECT t.OWNER, t.TABLE_NAME
          FROM DBA_TABLES t
          WHERE (t.OWNER, t.TABLE_NAME) NOT IN (SELECT DISTINCT c.OWNER, c.TABLE_NAME
                                                  FROM DBA_CONSTRAINTS c
                                                  WHERE c.CONSTRAINT_TYPE IN ('U', 'P')) AND
                (t.OWNER, t.TABLE_NAME) NOT IN (SELECT i.OWNER, i.TABLE_NAME
                                                  FROM DBA_INDEXES i
                                                  WHERE i.UNIQUENESS = 'UNIQUE'))
  ORDER BY OWNER, TABLE_NAME

EDIT

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

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