0

我是数据库的初学者,我得到了这个困难的拍卖数据库项目。我也在使用 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。然后列购买者将从对该项目出价的表用户获取名称。

这条规则对我来说太难了,我想触发,但我不确定..

4

2 回答 2

3

你的模型不正确。首先,您需要一个表格来存储出价。然后,当拍卖结束时,您将最高的一个更新为中标。可能最好的方法是让工作每分钟运行一次,并找到任何新关闭的拍卖的获胜者。

触发器不适用于您拥有的两个表,因为触发器仅在插入/更新或删除时触发。它不会开火,因为时间已经过去。进一步的触发器是一种高级技术,数据库初学者应该避免使用它们,因为编写不好的触发器可能会造成可怕的损害。

您可以有一个触发器,该触发器可用于插入出价表,将出价更新为获胜者,并将该状态从先前的获胜者中移除。然后,您只需在拍卖结束时停止接受新的出价。如果拍卖尚未开始,您的应用程序可以将标记为获胜者的投标人显示为 elader,如果拍卖结束,则显示为获胜者。

于 2013-05-20T21:13:46.023 回答
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,那么您可以保持架构相同,添加一个额外的列来存储用户的姓名,使用触发器填充它并保持计算列有条件地显示/不显示获胜者。 .

于 2013-05-20T21:24:59.517 回答