约束检查范围浮动

时间:2013-11-17 18:25:09

标签: sql oracle constraints

我的sql代码有问题(使用oracle)。

我很想对身高做出限制,身高应在1,0到2,4之间。数据类型是浮点数。小数位用逗号分隔。 这是代码:

alter table tableName
add constraint check_height
check (columnName between 1,0 and 2,4);

我尝试用逗号和点来划分代码中的小数位(我不能更改数据列表中的小数位数),我也尝试更改范围并用<来显示范围。取代。到目前为止没有任何工作。有谁知道我错过了什么?

错误消息是:'检查约束违反'。

欢呼

2 个答案:

答案 0 :(得分:5)

如果表中的数据中的数据值超出了约束条件,则无法使用默认的validate子句创建数据:

create table tableName(columnName number);

insert into tablename (columnName) values(2.5);

alter table tableName
add constraint check_height
check (columnName between 1.0 and 2.4);

SQL Error: ORA-02293: cannot validate (STACKOVERFLOW.CHECK_HEIGHT) - check constraint violated
02293. 00000 - "cannot validate (%s.%s) - check constraint violated"
*Cause:    an alter table operation tried to validate a check constraint to
           populated table that had nocomplying values.
*Action:   Obvious

(我的地区有nls_numeric_characters='.,',因此我使用.而不是,。)

您可以更正或删除无效值,也可以在仅通过指定novalidate clause验证新数据时允许保留错误值:

alter table tableName
add constraint check_height
check (columnName between 1.0 and 2.4)
novalidate;

table TABLENAME altered.

仍会验证新的插入或更新,这只会影响现有数据。

答案 1 :(得分:3)

小数位应使用小数部分中的点.分隔,而不是逗号,所以:

alter table tableName
add constraint check_height
check (columnName between 1.0 and 2.4);

修改

关于以下注释 - 不能使用与点.documentation)不同的小数点分隔符在SQL和PL / SQL中编写文字数字。您可以更改会话以设置NLS_NUMERIC_CHARACTERS参数以更改小数点分隔符,但只有在将其他类型的值转换为数字时才会将其考虑在内,例如TO_CHAR功能

如果更改NLS_NUMERIC_CHARACTERS,如果将数字括在引号中,则可以使用与点.不同的分隔符(这将导致使用字符集隐式转换为数字在NLS_NUMERIC_CHARACTERS中确定什么是小数点,什么是组分隔符)。所以,这将有效:

ALTER SESSION SET NLS_NUMERIC_CHARACTERS = ", ";

ALTER TABLE tableName
ADD CONSTRAINT check_height
CHECK (columnName BETWEEN '1,0' AND '2,4');