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