它';有可能在sql中实现这一点吗?
我要做一个点餐系统 我想这样做,当所有菜肴的状态都是“完成”时,订单会自动变为“完成” 我有四张桌子 1订单 ID_订单:OR00001 状态:正在处理/自动更改为“完成” 创建日期:2017年7月17日 3道菜 1道菜 意大利面 编号:PA00001 名称:意大利米德拉面食 厨师:杰夫 ID_订单:OR00001 状态:正在进行中 2道菜沙拉 编号:SA00001 名称:减肥沙拉 厨师:阿斯顿 ID_订单:OR00001 状态:正在进行中 3盘肉 编号:ME00001 名称:肉BBF 厨师:杰夫 ID_订单:OR00001 状态:正在进行中 怎么可能呢?谢谢它';有可能在sql中实现这一点吗?,sql,sql-server,sql-server-2005,Sql,Sql Server,Sql Server 2005,我要做一个点餐系统 我想这样做,当所有菜肴的状态都是“完成”时,订单会自动变为“完成” 我有四张桌子 1订单 ID_订单:OR00001 状态:正在处理/自动更改为“完成” 创建日期:2017年7月17日 3道菜 1道菜 意大利面 编号:PA00001 名称:意大利米德拉面食 厨师:杰夫 ID_订单:OR00001 状态:正在进行中 2道菜沙拉 编号:SA00001 名称:减肥沙拉 厨师:阿斯顿 ID_订单:OR00001 状态:正在进行中 3盘肉 编号:ME00001 名称:肉BBF 厨师:杰
CREATE TABLE [dbo].[ORDER](
[ID_OR] [int] IDENTITY(1,1) NOT NULL,
[ID_ORDER] AS ('OR'+right('00000'+CONVERT([varchar],[ID_OR],(0)),(5))),
[STATUS] [datetime] NOT NULL,
[CREATION_DATE] [datetime] NOT NULL,
CONSTRAINT [PK_RR] PRIMARY KEY CLUSTERED
(
[ID_ORDER] ASC
)WITH (IGNORE_DUP_KEY = OFF) ON [PRIMARY]
) ON [PRIMARY]
END
GO
CREATE TABLE [dbo].[1_DISH](
[ID_D1] [int] IDENTITY(1,1) NOT NULL,
[ID_PASTA] AS ('PA'+right('00000'+CONVERT([varchar],[ID_D1],(0)),(5))),
[NAME] [varchar](20),
[CHEF] [varchar](20),
[STATUS] [datetime] NOT NULL,
[ID_ORDER] [varchar](20)
CONSTRAINT [PK_RR] PRIMARY KEY CLUSTERED
(
[ID_PASTA] ASC
)WITH (IGNORE_DUP_KEY = OFF) ON [PRIMARY]
) ON [PRIMARY]
END
GO
CREATE TABLE [dbo].[2_DISH](
[ID_D2] [int] IDENTITY(1,1) NOT NULL,
[ID_SALAD] AS ('SA'+right('00000'+CONVERT([varchar],[ID_D2],(0)),(5))),
[NAME] [varchar](20),
[CHEF] [varchar](20),
[STATUS] [datetime] NOT NULL,
[ID_ORDER] [varchar](20)
CONSTRAINT [PK_RR] PRIMARY KEY CLUSTERED
(
[ID_SALAD] ASC
)WITH (IGNORE_DUP_KEY = OFF) ON [PRIMARY]
) ON [PRIMARY]
END
GO
CREATE TABLE [dbo].[3_DISH](
[ID_D3] [int] IDENTITY(1,1) NOT NULL,
[ID_MEAT] AS ('ME'+right('00000'+CONVERT([varchar],[ID_D3],(0)),(5))),
[NAME] [varchar](20),
[CHEF] [varchar](20),
[STATUS] [datetime] NOT NULL,
[ID_ORDER] [varchar](20)
CONSTRAINT [PK_RR] PRIMARY KEY CLUSTERED
(
[ID_MEAT] ASC
)WITH (IGNORE_DUP_KEY = OFF) ON [PRIMARY]
) ON [PRIMARY]
END
GO
下面是一些可能对您有所帮助的示例代码 创建了两个表:一个用于订单,另一个用于构成订单的菜品 我在Dish表中添加了一个DishType列。 我将状态更改为
varchar
数据类型
declare @ORDERTABLE table
(
[ID] [int] IDENTITY(1,1) NOT NULL,
[STATUS] [varchar](20) NOT NULL,
[CREATION_DATE] [datetime] NOT NULL
)
declare @DISHTABLE table
(
[ID] [int] IDENTITY(1,1) NOT NULL,
[DISHTYPE] varchar(20),
[NAME] [varchar](20),
[CHEF] [varchar](20),
[STATUS] [varchar](20) NOT NULL,
[ID_ORDER] int
)
插入一些示例数据
insert @ORDERTABLE (STATUS, CREATION_DATE) values
('IN PROCESS', getdate()),
('IN PROCESS', getdate());
insert @DISHTABLE (DISHTYPE, NAME, CHEF, STATUS, ID_ORDER) values
('PASTA','PASTA MIDELA','JEFF','IN PROCESS',1),
('SALAD','DIET SALAD','KIA','IN PROCESS',1),
('MEAT','MEAT BBF','BART','IN PROCESS',1),
('SALAD','CAESAR SALAD','KIA','IN PROCESS',2),
('MEAT','ROAST CHICKEN','BART','IN PROCESS',2);
update @DISHTABLE set STATUS = 'COMPLETE' where ID = 1;
update @DISHTABLE set STATUS = 'COMPLETE' where ID = 2;
update @DISHTABLE set STATUS = 'COMPLETE' where ID = 3;
select * from @DISHTABLE;
自动更改订单状态的一种简单方法:每当您更改一道菜的状态时,检查订单中有多少道菜,以及完成了多少道菜。如果所有菜肴都已完成,则将订单状态也更改为“完成”
declare @ORDERID int = 1;
update @ORDERTABLE
set STATUS = 'COMPLETE'
where
ID = @ORDERID
and (select count(*) from @DISHTABLE where ID_ORDER = @ORDERID) = (select count(*) from @DISHTABLE where ID_ORDER = @ORDERID and STATUS = 'COMPLETE');
select
o.ID,
DISHES = (select count(*) from @DISHTABLE where ID_ORDER = o.ID),
COMPLETED = (select count(*) from @DISHTABLE where ID_ORDER = o.ID and STATUS = 'COMPLETE'),
o.STATUS
from @ORDERTABLE o;
我不想评判你的设计,但我认为如果你把3道菜的桌子组合成一张桌子会更好。如果你真的特别喜欢数字,只需添加一栏,例如1号、2号或3号。您可以触发检查这3个表的状态,并在全部完成时更新订单表的状态。我同意Martono的观点——您可能会考虑只为一个表设置一个外键,用于“Dish”或“Item”。有很多方法可以使[订单]保持最新。老实说,我可能会1)使用存储过程更新我的菜肴,并将测试作为最后一步并相应地更新订单,或者2)从[order]中删除[Status]列,创建一个名为[OrderView]或[OrderInfo]的视图在读取时,非常简单的是完整的逻辑。首先确定您的实体和属性、实体之间的关系、规范化等。检查此链接以了解基本的数据库设计转储(我几乎不敢称之为)数据模型。如果点了第四道菜,没有甜点怎么办?你从来没有期望超过99999个订单?没有外键,为什么要使用ID_顺序而不是标识链接?