我是数据库的初学者,我得到了这个困难的拍卖数据库项目。 我也在使用SQL Server Management Studio。
create table user(
name char(10) not null,
lastname char(10) not null
)
create table item(
buyer varchar(10) null,
seller varchar(10) not null,
startprice numeric(5) not null,
description char(22) not null,
start_date datetime not null,
end_date datetime not null,
seller char(10) not null,
item_nummer numeric(9) not null,
constraint fk_user foreign key (buyer) references user (name)
)
基本上我试图在这里制定的规则是: 除非时间(start_date和end_date)结束且startprice没有上升或增加,否则列买方为NULL。然后,列买方将从投标该项目的表格用户获取该名称。
这条规则对我来说太难了,我想要触发,但我不确定..
答案 0 :(得分:3)
您的型号不正确。首先,您需要一个表格来存储出价。然后,当拍卖结束时,您将最高的一个更新为中标。最好的方法是拥有一个每分钟运行一次的工作,并找到任何新近结束的拍卖的获胜者。
触发器不会对您拥有的两个表有效,因为触发器仅在插入/更新或删除时触发。它不会因为时间过去而开火。进一步的触发器是一种先进的技术,db初学者应该避免使用它们,因为你可以通过编写错误的触发器来进行可怕的破坏。
您可以设置一个触发器,可以插入到出价表中,该触发器会将出价更新为获胜者,并使该状态远离之前的获胜者。然后,您只需在拍卖结束时停止接受新的出价。如果拍卖是开放式的,您的应用程序可以显示标记为获胜者的投标人,如果关闭,则显示获胜者。
答案 1 :(得分:0)
在解决问题之前,您的架构存在一些初步问题需要解决。以下是为了显着简化答案的实施而做出的改变:
-- Added brackets around User b/c "user" is a reserved keyword
-- Added INT Identity PK to [User]
CREATE TABLE [user]
(
UserId INT NOT NULL
IDENTITY
PRIMARY KEY
, name CHAR(10) NOT NULL
, lastname CHAR(10) NOT NULL
)
/* changed item_nummer (I'm not sure what a nummer is...) to ItemId int not null identity primary key
Removed duplicate Seller columns and buyer column
Replaced buyer/seller columns with FK references to [User].UserId
Add currentBid to capture current bid
Added CurrentHighBidderId
Added WinningBidderId as computed column
*/
CREATE TABLE item
(
ItemId INT NOT NULL
IDENTITY
PRIMARY KEY
, SellerId INT NOT NULL
FOREIGN KEY REFERENCES [User] ( UserId )
, CurrentHighBidderId INT NULL
FOREIGN KEY REFERENCES [User] ( UserId )
, CurrentBid MONEY NOT NULL
, StartPrice NUMERIC(5) NOT NULL
, Description CHAR(22) NOT NULL
, StartDate DATETIME NOT NULL
, EndDate DATETIME NOT NULL
)
go
ALTER TABLE dbo.item ADD
WinningBidderId AS CASE WHEN EndDate < CURRENT_TIMESTAMP
AND currentBid > StartPrice THEN CurrentHighBidderId ELSE NULL END
GO
使用附加列,计算列可以返回正确的信息。如果必须返回获胜者的名称而不是id,那么您可以将模式保持在相同的位置,添加一个额外的列来存储用户的名称,使用触发器填充它并保持计算列有条件显示/不显示获胜者..