对所有数值表的约束

时间:2013-06-13 06:38:19

标签: sql oracle

我需要对所有数字列设置约束,这是我尝试过的: 一切都必须是正确的

ALTER TABLE * ADD CONSTRAINT Checknumbers CHECK ( > 0 )

这不起作用,但我找不到适合它的解决方案。

他们可以使用的任何其他语法或者我需要为每个表手动完成吗?

1 个答案:

答案 0 :(得分:4)

您需要为每个表中的每个列创建一个单独的约束。您可能会为此

编写一些动态SQL
DECLARE
  l_sql_stmt VARCHAR2(1000);
BEGIN
  FOR x IN (SELECT *
              FROM user_tab_columns
             WHERE data_type = 'NUMBER'
               AND table_name in (SELECT table_name
                                    FROM user_tables
                                   WHERE dropped = 'NO' )
  LOOP
    l_sql_stmt := 'ALTER TABLE ' || x.table_name || 
                  '  ADD CONSTRAINT chk_' || x.table_name || '_' || x.column_name ||
                  ' CHECK( ' || x.column_name || ' > 0)';
    EXECUTE IMMEDIATE l_sql_stmt;
  END LOOP;
END;

对于当前架构中每个表中的每个数字列,这将尝试创建一个检查约束。约束名称限制为30个字符,因此如果表名和列名的长度之和大于25,则会尝试生成无效的标识符。您需要找出生成约束名称的另一种方法(或者您可以让系统生成名称)。如果碰巧有这些标识符,这也不会处理区分大小写的标识符。如果这对您来说是个问题,您需要对标识符进行双重引用。