我是一个sql和mysql新手,所以我不确定这是如何工作的。我知道mysql不能识别创建断言检查。但我正在尝试使用一个布尔值来强制执行客户表中特定客户的约束。
我已经被告知我可以使用CREATE TRIGGER,但是没有找到足够好的例子来看看如何应用它。
CREATE ASSERTION CHECK(
Contains_Nuts FROM Bagel
WHERE Contains_Nuts = TRUE
SELECT Name, DOB
FROM Customer WHERE Nut_Allergy = TRUE);
我知道这个问题很模糊,代码完全错误,所以请告诉我需要添加的内容以使其更清晰。
这里要求的是我想申请的表格设计,
CREATE TABLE Customer(
CustomerID INTEGER NOT NULL,
Name VARCHAR(255) NOT NULL,
Address_HouseNum VARCHAR(5),
Address_PostCode VARCHAR(8) NOT NULL,
Address_StreetName VARCHAR(255),
Title VARCHAR(6),
Email VARCHAR(255),
DOB DATE,
Order_History INTEGER,
Nut_Allergy Boolean,
PRIMARY KEY (CustomerID)
);
CREATE TABLE Bagel(
BagelID INTEGER NOT NULL,
Contains_Nuts BOOLEAN NOT NULL,
Price DECIMAL(4,2) NOT NULL,
Description VARCHAR(255),
PRIMARY KEY(BagelID)
);
CREATE TABLE `Order`(
OrderID INTEGER NOT NULL,
O_CustomerID INTEGER NOT NULL,
O_BagelCardID VARCHAR(16),
O_BagelID INTEGER,
O_BagelFillingID INTEGER NOT NULL,
O_DrinkID INTEGER,
Order_date DATE NOT NULL,
Order_Cost DECIMAL(4,2) NOT NULL, -- Assumption : Order_cost is the final price worked out after a discount has/hasnot been applied.
Discount_applied BOOLEAN,
PRIMARY KEY(OrderID,O_CustomerID,O_BagelCardID,O_BagelID,O_BagelFillingID,O_DrinkID),
FOREIGN KEY (O_CustomerID)
REFERENCES Customer(CustomerID)
ON DELETE RESTRICT
ON UPDATE CASCADE,
FOREIGN KEY (O_BagelCardID)
REFERENCES BagelCard(BagelCardID)
ON DELETE RESTRICT
ON UPDATE CASCADE,
FOREIGN KEY (O_BagelID)
REFERENCES Bagel(BagelID)
ON DELETE RESTRICT
ON UPDATE CASCADE,
FOREIGN KEY (O_BagelFillingID)
REFERENCES BagelFilling(BagelFillingID)
ON DELETE RESTRICT
ON UPDATE CASCADE,
FOREIGN KEY (O_DrinkID)
REFERENCES Drink(DrinkID)
ON DELETE RESTRICT
ON UPDATE CASCADE
);
答案 0 :(得分:0)
我试试这个INSERT触发器:
DELIMITER $$
CREATE TRIGGER check_healthyness BEFORE INSERT ON orders
FOR EACH ROW
BEGIN
IF EXISTS ( select 1
from bagel b join customer c
on (b.BagelID=NEW.O_BagelID
and c.CustomerID=NEW.O_CustomerID)
where (c.nut_allergy=true
and b.contains_nuts=true) ) THEN
-- complain:
signal sqlstate '45000' set message_text = 'Bagel contains nuts';
END IF;
END $$
DELIMITER ;
有关SIGNAL子句,请参阅this(使用MySQL 5.5 +)。
如果将为给定客户下一个坚果百吉饼的订单,则此触发器将使INSERT变为orders
。您还可以建立UPDATE触发器(除此之外)以防止UPDATE到order
表。
我还没有对它进行过测试,但SELECT语句应该会给你一个想法。