我的sql代码有问题(使用oracle)。
我很想对身高做出限制,身高应在1,0到2,4之间。数据类型是浮点数。小数位用逗号分隔。 这是代码:
alter table tableName
add constraint check_height
check (columnName between 1,0 and 2,4);
我尝试用逗号和点来划分代码中的小数位(我不能更改数据列表中的小数位数),我也尝试更改范围并用<来显示范围。取代。到目前为止没有任何工作。有谁知道我错过了什么?
错误消息是:'检查约束违反'。
欢呼答案 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');