金额=单价*数量;如何约束金额?

liguokun 2010-05-15 06:12:57
现有两个表:订购单(订单编号,金额);订单明细(订单编号,单价,数量)。
金额=单价*数量;如何约束金额?
...全文
182 16 打赏 收藏 转发到动态 举报
写回复
用AI写文章
16 条回复
切换为时间正序
请发表友善的回复…
发表回复
zhangyongtian_0810 2010-05-16
  • 打赏
  • 举报
回复
路过 帮顶
rmljoe 2010-05-15
  • 打赏
  • 举报
回复
约束金额要看你怎么约束,1)针对订单,全部订单不允许超过某个金额;2)针对采购员,采购员的单个订单不允许超过设定给他的某个金额;3)针对供应商,不允许对该供应商的单个订单超过设定的某个金额。4)针对审批人,不允许审批超过他审批权的金额。等等。而这些约束条件分别何在在采购员表、供应商表、审批流程表里,保存订单或审批订单的通过调用相关表的约束来判断。
xugan666 2010-05-15
  • 打赏
  • 举报
回复
路过.............
sql_lover 2010-05-15
  • 打赏
  • 举报
回复
楼主的订单明细应该是产品编号,数量,金额吧,你这样构建表好奇怪~~~~
  • 打赏
  • 举报
回复
哦~谢谢,借用楼主的地盘了。。。
htl258_Tony 2010-05-15
  • 打赏
  • 举报
回复
[Quote=引用 10 楼 zyaim 的回复:]
请问永生哥,当在RollBack下面加一句RAISERROR,那这个提示内容是只有在查询分析器中显示出来,还是会啪——弹出一个msgbox给终端用户呢?
[/Quote]
程序中可以获到。
  • 打赏
  • 举报
回复
请问永生哥,当在RollBack下面加一句RAISERROR,那这个提示内容是只有在查询分析器中显示出来,还是会啪——弹出一个msgbox给终端用户呢?
永生天地 2010-05-15
  • 打赏
  • 举报
回复
[Quote=引用 6 楼 htl258 的回复:]
SQL code
----------------------------------------------------------------------------------
-- Author : htl258(Tony)
-- Date : 2010-05-15 18:33:15
-- Version: Microsoft SQL Server 2008 (RTM) - 1……
[/Quote]

自定义函数,很棒
永生天地 2010-05-15
  • 打赏
  • 举报
回复
触发器方式
create trigger triu_订购单
on 订购单
for insert,update
as
begin
declare @c numeric(18,4),@c1 numeric(18,4)
select @c=金额 from inserted
select @c1=sum(单价*数量) from 订单明细 m,inserted i where m.订单编号=i.订单编号
if @c<>@c1
rollback
end
feixianxxx 2010-05-15
  • 打赏
  • 举报
回复
[Quote=引用 6 楼 htl258 的回复:]

SQL code
----------------------------------------------------------------------------------
-- Author : htl258(Tony)
-- Date : 2010-05-15 18:33:15
-- Version: Microsoft SQL Server 2008 (RTM) - 10.……
[/Quote]

oh function ~~~~

good idea~
htl258_Tony 2010-05-15
  • 打赏
  • 举报
回复
----------------------------------------------------------------------------------
-- Author : htl258(Tony)
-- Date : 2010-05-15 18:33:15
-- Version: Microsoft SQL Server 2008 (RTM) - 10.0.1600.22 (Intel X86)
-- Jul 9 2008 14:43:34
-- Copyright (c) 1988-2008 Microsoft Corporation
-- Developer Edition on Windows NT 5.1 <X86> (Build 2600: Service Pack 2)
-- Blog : http://blog.csdn.net/htl258
----------------------------------------------------------------------------------

--> 生成测试数据表: [订购单]
IF OBJECT_ID('[订购单]') IS NOT NULL
DROP TABLE [订购单]
GO
CREATE TABLE [订购单] ([订单编号] [int],[金额] [int])
INSERT INTO [订购单]
SELECT '1','12'

--> 生成测试数据表: [订单明细]
IF OBJECT_ID('[订单明细]') IS NOT NULL
DROP TABLE [订单明细]
GO
CREATE TABLE [订单明细] ([订单编号] [int],[单价] [int],[数量] [int])
INSERT INTO [订单明细]
SELECT '1','3','4' UNION ALL
SELECT '2','5','8'

SELECT * FROM [订购单]
SELECT * FROM [订单明细]

-->SQL查询如下:
if object_id('f_getamount') is not null
drop function f_getamount
go
create function f_getamount
(@订单编号 int)
returns money
as
begin
return(select sum(单价*数量) from [订单明细] where [订单编号]=@订单编号)
end
go

--创建约束:
alter table [订购单] add check([金额]=dbo.f_getamount([订单编号]))
go

insert [订购单] select 2,12
/*
消息 547,级别 16,状态 0,第 1 行
INSERT 语句与 CHECK 约束"CK__订购单__3F1C4B12"冲突。该冲突发生于数据库"mydb",表"dbo.订购单"。
语句已终止。
*/
insert [订购单] select 2,40
/*

(1 行受影响)
*/

select * from [订购单]
/*
订单编号 金额
----------- -----------
1 12
2 40

(2 行受影响)
*/
用约束的方法
feixianxxx 2010-05-15
  • 打赏
  • 举报
回复
[Quote=引用 4 楼 liguokun 的回复:]

引用 1 楼 feixianxxx 的回复:
约束是不能跨表的。。。只能使用 触发器了。。。


兄弟,怎么用触发器来实现?
[/Quote]

你的2个表数值怎么插入的 。。。
先插入哪个。。。
liguokun 2010-05-15
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 feixianxxx 的回复:]
约束是不能跨表的。。。只能使用 触发器了。。。
[/Quote]

兄弟,怎么用触发器来实现?
liguokun 2010-05-15
  • 打赏
  • 举报
回复
[Quote=引用楼主 liguokun 的回复:]
现有两个表:订购单(订单编号,金额);订单明细(订单编号,单价,数量)。
金额=单价*数量;如何约束金额?
[/Quote]


兄弟,怎么用触发器来实现?
永生天地 2010-05-15
  • 打赏
  • 举报
回复
没有办法,
这样的问题是你不该在订单表中加金额列

feixianxxx 2010-05-15
  • 打赏
  • 举报
回复
约束是不能跨表的。。。只能使用 触发器了。。。

34,587

社区成员

发帖
与我相关
我的任务
社区描述
MS-SQL Server相关内容讨论专区
社区管理员
  • 基础类社区
  • 二月十六
  • 卖水果的net
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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