我需要对所有数字列设置约束,这是我尝试过的: 一切都必须是正确的
ALTER TABLE * ADD CONSTRAINT Checknumbers CHECK ( > 0 )
这不起作用,但我找不到适合它的解决方案。
他们可以使用的任何其他语法或者我需要为每个表手动完成吗?
答案 0 :(得分:4)
您需要为每个表中的每个列创建一个单独的约束。您可能会为此
编写一些动态SQLDECLARE
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,则会尝试生成无效的标识符。您需要找出生成约束名称的另一种方法(或者您可以让系统生成名称)。如果碰巧有这些标识符,这也不会处理区分大小写的标识符。如果这对您来说是个问题,您需要对标识符进行双重引用。