Создать первичное ограничение из столбцов таблицы - PullRequest
1 голос
/ 08 июля 2019

У меня есть таблица с именем PRIMARY_CONSTRAINTS в БД, такая как в ней есть имя таблицы, имя ограничения и имя столбца основных ограничений, которые я хочу добавить.

Это БД Oracle Oracle.

Я пробовал что-то подобное, но оно не запускается

ALTER TABLE TABLE_NAME
      ADD CONSTRAINT CONSTRAINT_NAME PRIMARY KEY (COLUMN_NAME)
      WHERE TABLE_NAME, CONSTRAINT_NAME, COLUMN_NAME IN 
      ( SELECT TABLE_NAME,
               CONSTRAINT_NAME, 
               COLUMN_NAME
        FROM PRIMARY_CONSTRAINTS );

Как я могу ссылаться на него, чтобы я мог изменить таблицы? Спасибо

Ответы [ 2 ]

2 голосов
/ 08 июля 2019

Вы можете использовать следующий динамический блок для достижения того же:

BEGIN
    FOR Q IN (
        SELECT
            'ALTER TABLE '
            || TABLE_NAME
            || ' ADD CONSTRAINT '
            || CONSTRAINT_NAME
            || ' PRIMARY KEY ( '
            || COLUMN_NAME
            || ')' QRY
        FROM
            PRIMARY_CONSTRAINTS
    ) LOOP
        EXECUTE IMMEDIATE Q.QRY;
    END LOOP;
END;
/

Я создал небольшую демонстрацию для вас -> db <> fiddle demo


ОБНОВЛЕНО В СООТВЕТСТВИИ С КОММЕНТАРИЕМ

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

BEGIN
    FOR Q IN (
        SELECT
            'ALTER TABLE '
            || TABLE_NAME
            || ' ADD CONSTRAINT '
            || MAX(CONSTRAINT_NAME)
            || ' PRIMARY KEY ( '
            || LISTAGG(COLUMN_NAME,',') WITHIN GROUP (ORDER BY NULL)
            || ')' QRY
        FROM
            PRIMARY_CONSTRAINTS
        GROUP BY TABLE_NAME
    ) LOOP
        EXECUTE IMMEDIATE Q.QRY;
    END LOOP;
END;
/

db <> обновленная демоверсия fiddle

0 голосов
/ 08 июля 2019

Что касается вашего комментария о нескольких столбцах ограничений, мы могли бы настроить данные в таблице PRIMARY_CONSTRAINTS таким же образом, как они будут использоваться в операторе Alter Table.

Например: предположим, что мы должныиспользуйте следующую инструкцию для создания ограничения. Изменить таблицу. Добавить ограничение. Constraint_Name первичный ключ columnA, columnB;

Тогда запись для этого конкретного ограничения в вашей таблице PRIMARY_CONSTRAINTS будет иметь значение columnA, columnB для COLUMN_NAME.

Надеюсь, это поможет.

С уважением, Акаш

...