Код SQL для проверки отношений «многие ко многим»

Я безостановочно исследовал, и мне удалось только выяснить, как проверить отношение 1-ко-многим в SQL. Я хочу знать, может ли кто-нибудь помочь мне узнать, как проверить отношение «многие ко многим» в коде SQL. Таблицы в базе данных имеют правильную нормальную форму.

Сценарий у меня такой:

  • Пользователь выберет три таблицы из базы данных.
  • После выбора трех таблиц мне нужно проверить, имеют ли эти таблицы связь «многие ко многим».
  • Поэтому мне нужно проверить, связаны ли три таблицы, выбранные пользователем, с первичным ключом, а таблица пересечений имеет два ссылочных ключа, которые указывают на две другие таблицы.

SELECT K_Table = FK.TABLE_NAME,
       FK_Column = CU.COLUMN_NAME,
       PK_Table = PK.TABLE_NAME,
       PK_Column = PT.COLUMN_NAME,
       Constraint_Name = C.CONSTRAINT_NAME
FROM INFORMATION_SCHEMA.REFERENTIAL_CONSTRAINTS C 
INNER JOIN INFORMATION_SCHEMA.TABLE_CONSTRAINTS FK 
        ON C.CONSTRAINT_NAME = FK.CONSTRAINT_NAME
INNER JOIN INFORMATION_SCHEMA.TABLE_CONSTRAINTS PK 
        ON C.UNIQUE_CONSTRAINT_NAME = PK.CONSTRAINT_NAME
INNER JOIN INFORMATION_SCHEMA.KEY_COLUMN_USAGE CU 
        ON C.CONSTRAINT_NAME = CU.CONSTRAINT_NAME 
INNER JOIN (SELECT i1.TABLE_NAME, 
                   i2.COLUMN_NAME
            FROM INFORMATION_SCHEMA.TABLE_CONSTRAINTS i1
            INNER JOIN INFORMATION_SCHEMA.KEY_COLUMN_USAGE i2 
                    ON i1.CONSTRAINT_NAME = i2.CONSTRAINT_NAME
            WHERE i1.CONSTRAINT_TYPE = 'PRIMARY KEY') PT 
        ON PT.TABLE_NAME = PK.TABLE_NAME
WHERE PK.TABLE_NAME = '" + ActionM2M.Table2 + "'  AND 
      FK.TABLE_NAME = '" + ActionM2M.ITableNames1 + "' AND 
      exists (SELECT K_Table = FK.TABLE_NAME,
                     FK_Column = CU.COLUMN_NAME,
                     PK_Table = PK.TABLE_NAME,
                     PK_Column = PT.COLUMN_NAME,
                     Constraint_Name = C.CONSTRAINT_NAME
              FROM INFORMATION_SCHEMA.REFERENTIAL_CONSTRAINTS C 
              INNER JOIN INFORMATION_SCHEMA.TABLE_CONSTRAINTS FK 
                      ON C.CONSTRAINT_NAME = FK.CONSTRAINT_NAME 
              INNER JOIN INFORMATION_SCHEMA.TABLE_CONSTRAINTS PK 
                      ON C.UNIQUE_CONSTRAINT_NAME = PK.CONSTRAINT_NAME
              INNER JOIN INFORMATION_SCHEMA.KEY_COLUMN_USAGE CU 
                      ON C.CONSTRAINT_NAME = CU.CONSTRAINT_NAME 
              INNER JOIN (SELECT i1.TABLE_NAME, i2.COLUMN_NAME
                          FROM INFORMATION_SCHEMA.TABLE_CONSTRAINTS i1
                          INNER JOIN INFORMATION_SCHEMA.KEY_COLUMN_USAGE i2 
                                  ON i1.CONSTRAINT_NAME = i2.CONSTRAINT_NAME
                          WHERE i1.CONSTRAINT_TYPE = 'PRIMARY KEY') PT
                      ON PT.TABLE_NAME = PK.TABLE_NAME
              WHERE PK.TABLE_NAME = '" + ActionM2M.Table1 + "'  AND 
                    FK.TABLE_NAME = '" + ActionM2M.ITableNames1 + "')

person SpaceApple    schedule 10.01.2012    source источник
comment
Можете ли вы объяснить, что у вас есть? У вас есть одна таблица, и вы пытаетесь проанализировать ее, чтобы увидеть, находится ли она в правильной нормальной форме? Или у вас есть несколько таблиц, и вы пытаетесь определить, является ли одна из них ассоциативной (или соединительной) таблицей с первичным ключом, содержащим две ссылки на другие таблицы? Какова цель попытки найти отношения «многие ко многим»?   -  person Jonathan Leffler    schedule 10.01.2012
comment
Этот ответ должен помочь: stackoverflow.com/questions/786918/   -  person Raymond Hettinger    schedule 10.01.2012
comment
Таблицы в базе данных имеют правильную нормальную форму. У меня есть сценарий: пользователь выберет три таблицы из базы данных, после того как три таблицы будут выбраны, мне нужно проверить, имеют ли эти таблицы отношение «многие ко многим». поэтому мне нужно проверить, связаны ли те три таблицы, которые выбрал пользователь, с первичным ключом, а таблица пересечений имеет два ссылочных ключа, которые указывают на две другие таблицы. Я надеюсь, что объяснил достаточно.   -  person SpaceApple    schedule 10.01.2012


Ответы (1)


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

Вы не указали, на каком языке вы это кодируете, или какую СУБД вы используете. Таким образом, конкретные детали будут отсутствовать. Тем не мение:

  • Есть способы узнать первичный ключ каждой таблицы. Это может быть метод ODBC или JDBC, или вы можете запрашивать таблицы SQL/Schema, или вы можете напрямую запрашивать системный каталог.
  • Точно так же существуют способы узнать внешние ключи для каждой таблицы, включая ссылочные столбцы и ссылочные таблицы.
  • Если три таблицы выбраны в случайной последовательности, вам нужно просмотреть первичные ключи каждой таблицы, чтобы найти составную и содержащую столбцы из двух внешних ключей. Затем вы проверяете, что на две другие таблицы ссылаются внешние ключи.
  • В идеале, однако, вы должны знать, что первые две выбранные таблицы должны быть ссылочной таблицей, а третья должна быть таблицей «пересечение», «соединение» или «ассоциация», поэтому вам не нужно находить какая таблица имеет роль «соединения»; вы просто проверяете, что таблица, обозначенная как имеющая роль «соединения», действительно соответствует требованиям.

Я думаю, что вам может быть лучше предоставить информацию о ссылках пользователю, а не заставлять их выбирать таблицы, но это зависит от того, являются ли ваши «пользователи» администраторами баз данных или они из отдела кадров или финансов и не имеют ни малейшего представления. про СУБД и таблицы в первую очередь.

person Jonathan Leffler    schedule 10.01.2012
comment
Пользователи являются разработчиками, которые будут использовать это приложение, чтобы упростить обслуживание таблиц. В основном это реляционная база данных на SQL: это код, который у меня есть в то же время, но я знаю, что это неправильное решение, поскольку оно проверяет только две таблицы за раз вместо трех. - person SpaceApple; 10.01.2012