约束计算列大于0的问题

hitrico 2016-10-26 04:19:19
hi,各位高手,现在碰到一个约束的问题,请教一下:
表有三个数值列a,b,c,c是计算列=a-b
a值是表里现有的数值,用存储过程对b值进行插入,现在想限制c列必须大于等于0,b值才能插入,
我再c列建了约束,check表达式是a-b>=0,
但是出现的问题是:假如a值为1,现在插入b值为2,还是可以插入,但是b值自动变为1了,
要怎样才能不自动变而是不插入报错呢,不要在存储过程中判断,有什么办法?谢谢了

...全文
355 14 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
14 条回复
切换为时间正序
请发表友善的回复…
发表回复
hitrico 2016-10-26
  • 打赏
  • 举报
回复
引用 12 楼 wmxcn2000 的回复:
[quote=引用 10 楼 hitrico 的回复:] 不好意思,我的问题点是在于:在a1,b为2的情况下还是可以插入,但是b值自动变为1了,不知道这是什么原因?
数据被改动了啊? 那可能是触发器,也可能是别的会话改的; [/quote] 谢谢,确实不是约束的问题
hitrico 2016-10-26
  • 打赏
  • 举报
回复
前面的约束写好了之后,在存储过程中对表进行操作: set update t1 set a.c = ISNULL(t1.c,0) + t2.Number from tab1 t1 inner join tab2 t2 on a.id = b.RequisitionNo and a.FormIndex = b.RequisitionIndex
引用 11 楼 roy_88 的回复:
自动变0,检查表是否有触发器改变值
谢谢,确实不是约束的问题
卖水果的net 2016-10-26
  • 打赏
  • 举报
回复
引用 10 楼 hitrico 的回复:
不好意思,我的问题点是在于:在a1,b为2的情况下还是可以插入,但是b值自动变为1了,不知道这是什么原因?
数据被改动了啊? 那可能是触发器,也可能是别的会话改的;
中国风 2016-10-26
  • 打赏
  • 举报
回复
自动变0,检查表是否有触发器改变值
hitrico 2016-10-26
  • 打赏
  • 举报
回复
引用 9 楼 wmxcn2000 的回复:
-- 你自己改一下条件,就可以了,比我还懒。。。

create table test(a int, b int, c as a - b)
go
alter table test add constraint chk_a check (a>=b)
go
insert into test(a,b) values(100,80)
go
insert into test(a,b) values(80,80)
go
insert into test(a,b) values(80,100)
go
select * from test 
go
drop table test 
go
 
(1 行受影响)

(1 行受影响)
消息 547,级别 16,状态 0,第 1 行
INSERT 语句与 CHECK 约束"chk_a"冲突。该冲突发生于数据库"test",表"dbo.test"。
语句已终止。
a           b           c
----------- ----------- -----------
100         80          20
80          80          0

(2 行受影响)


[quote=引用 6 楼 hitrico 的回复:] [quote=引用 4 楼 wmxcn2000 的回复:] 直接约束 a- b> 0 或 a>b 就可以了;
但是要允许0的情况啊[/quote][/quote] 不好意思,我的问题点是在于:在a1,b为2的情况下还是可以插入,但是b值自动变为1了,不知道这是什么原因?
卖水果的net 2016-10-26
  • 打赏
  • 举报
回复
-- 你自己改一下条件,就可以了,比我还懒。。。

create table test(a int, b int, c as a - b)
go
alter table test add constraint chk_a check (a>=b)
go
insert into test(a,b) values(100,80)
go
insert into test(a,b) values(80,80)
go
insert into test(a,b) values(80,100)
go
select * from test 
go
drop table test 
go
 
(1 行受影响)

(1 行受影响)
消息 547,级别 16,状态 0,第 1 行
INSERT 语句与 CHECK 约束"chk_a"冲突。该冲突发生于数据库"test",表"dbo.test"。
语句已终止。
a           b           c
----------- ----------- -----------
100         80          20
80          80          0

(2 行受影响)


引用 6 楼 hitrico 的回复:
[quote=引用 4 楼 wmxcn2000 的回复:] 直接约束 a- b> 0 或 a>b 就可以了;
但是要允许0的情况啊[/quote]
中国风 2016-10-26
  • 打赏
  • 举报
回复
看到我的例子没 你计算列少了PERSISTED 关健字,这是持久化,计算列要加上才能用
hitrico 2016-10-26
  • 打赏
  • 举报
回复
引用 1 楼 roy_88 的回复:
? 你是要限制新增这类数据,还是要不报错 正常约束可这样用
CREATE TABLE Tab12(a INT,b INT,c AS a-b PERSISTED)
ALTER TABLE Tab12 ADD CONSTRAINT CHK_Tab12 CHECK(c>=0);

INSERT INTO Tab12(a,b)VALUES(1,2);
/*
消息 547,级别 16,状态 0,第 4 行
INSERT 语句与 CHECK 约束"CHK_Tab12"冲突。.....
语句已终止。
*/
DROP TABLE Tab12
我直接写check c>=0,报错:计算列 'c' 在"CHECK CONSTRAINT"中的使用无效,因为它未持久化
hitrico 2016-10-26
  • 打赏
  • 举报
回复
引用 4 楼 wmxcn2000 的回复:
直接约束 a- b> 0 或 a>b 就可以了;
但是要允许0的情况啊
hitrico 2016-10-26
  • 打赏
  • 举报
回复
引用 2 楼 roy_88 的回复:
理清淅自己思路,再表达自己的问题 表达不清,参照 【SQL Server版块】提问的智慧 http://bbs.csdn.net/topics/391996442
不好意思,打字的时候多打了一个(不)字了,是要限制新增这类数据
卖水果的net 2016-10-26
  • 打赏
  • 举报
回复
直接约束 a- b> 0 或 a>b 就可以了;
卖水果的net 2016-10-26
  • 打赏
  • 举报
回复

create table test(a int, b int, c as a - b)
go
alter table test add constraint chk_a check (a>b)
go
insert into test(a,b) values(100,80)
go
insert into test(a,b) values(80,80)
go
select * from test 
go
drop table test 
go
 
(1 行受影响)
消息 547,级别 16,状态 0,第 1 行
INSERT 语句与 CHECK 约束"chk_a"冲突。该冲突发生于数据库"test",表"dbo.test"。
语句已终止。
a           b           c
----------- ----------- -----------
100         80          20

(1 行受影响)


中国风 2016-10-26
  • 打赏
  • 举报
回复
理清淅自己思路,再表达自己的问题 表达不清,参照 【SQL Server版块】提问的智慧 http://bbs.csdn.net/topics/391996442
中国风 2016-10-26
  • 打赏
  • 举报
回复

你是要限制新增这类数据,还是要不报错

正常约束可这样用
CREATE TABLE Tab12(a INT,b INT,c AS a-b PERSISTED)
ALTER TABLE Tab12 ADD CONSTRAINT CHK_Tab12 CHECK(c>=0);

INSERT INTO Tab12(a,b)VALUES(1,2);
/*
消息 547,级别 16,状态 0,第 4 行
INSERT 语句与 CHECK 约束"CHK_Tab12"冲突。.....
语句已终止。
*/
DROP TABLE Tab12

22,301

社区成员

发帖
与我相关
我的任务
社区描述
MS-SQL Server 疑难问题
社区管理员
  • 疑难问题社区
  • 尘觉
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧