在阅读了一些规范化之后,似乎我不太了解这个概念。
我正在尝试做的是创建一个表,其中包含有关项目抽奖活动的信息。
因此,该项目的信息是ItemName和Defindex。
之后,我需要有抽奖活动的“门票”,以及去过的用户。我想限制售票数量。
因此,TicketA,TicketB,TicketC,TicketD。
是否存在一个查询,我可以使用该查询将球员姓名(如果未满)插入到TicketA中,或者如果TicketB如果已满,则将其插入其中,依此类推,直到售出所有门票为止?
最佳答案
以下是帮助您入门的示例:SQL Fiddle
设置基本表格以跟踪抽奖和彩票。
CREATE TABLE Raffle
(
Id BIGINT AUTO_INCREMENT NOT NULL PRIMARY KEY
,Name VARCHAR(50) NOT NULL
,WinnerLimit INT NOT NULL
);
CREATE TABLE RaffleTicket
(
Id BIGINT AUTO_INCREMENT NOT NULL PRIMARY KEY
,RaffleId BIGINT NOT NULL
,UserId BIGINT NOT NULL
);
设置一个视图以确定抽奖是否还剩票证。
CREATE VIEW RaffleStatus
AS
SELECT Id AS RaffleId,
CASE WHEN EXISTS
(
SELECT 1
FROM RaffleTicket rt
WHERE rt.RaffleId = r.Id
GROUP BY rt.RaffleId
HAVING COUNT(rt.RaffleId) = r.WinnerLimit
)
THEN 1
ELSE 0
END AS SoldOut
FROM Raffle r;
创建一个过程以防止门票超售。请注意,这对于多线程使用可能并不安全。
DELIMITER //
CREATE PROCEDURE InsertRaffleTicket (IN userId BIGINT, IN raffleId BIGINT)
BEGIN
INSERT INTO RaffleTicket(UserId, RaffleId)
SELECT userId, raffleId
FROM RaffleStatus rs
WHERE rs.RaffleId = raffleId
AND rs.SoldOut = 0;
END//
DELIMITER ;