从表列创建主约束

时间:2019-07-08 08:31:24

标签: sql oracle ddl

我在数据库中有一个名为PRIMARY_CONSTRAINTS的表,例如它具有我要添加的主要约束的表名,约束名和列名。

这是一个SQL 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 个答案:

答案 0 :(得分:2)

您可以使用以下动态块来实现相同目的:

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 demo updated

答案 1 :(得分:0)

关于您对约束的多列的评论,我们可以按照在Alter Table语句中使用的相同方式在PRIMARY_CONSTRAINTS表中设置数据。

例如:假设我们必须使用以下语句创建约束,即在Alter表中添加约束Constraint_Name主键columnA,columnB;

然后,PRIMARY_CONSTRAINTS表中此特定约束的条目的值将为COLUMN_NAME的columnA,columnB。

希望这会有所帮助。

问候 阿卡什(Akash)