如何创建可在创建断言检查中使用的Select语句? -MySQL

时间:2016-03-13 12:21:59

标签: mysql

我是一个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

);

1 个答案:

答案 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语句应该会给你一个想法。

相关问题