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

标签 mysql

我是一个 sql 和 mysql 新手,所以我不确定这是如何工作的。我知道 mysql 无法识别创建断言检查。但我正在尝试对 bool 值执行一项操作,以对客户表中的特定客户实现约束。

有人告诉我可以使用 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

);

最佳答案

我会尝试这个 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 ;

引用this对于 SIGNAL 子句(使用 MySQL 5.5+)。

如果它为给定客户下了坚果百吉饼订单,则此触发器将导致无法插入订单。您还可以建立一个 UPDATE 触发器(除了这个触发器之外)来防止对 order 表进行 UPDATE。

我还没有测试过它,但是 SELECT 语句应该可以给你一个想法。

关于mysql - 如何创建可在创建断言检查中使用的 Select 语句? -MySQL,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35970170/

相关文章:

mysql - 如何更改现有外键以添加约束名称

mysql - 计算同一个表上的行之间的平均时间差

javascript - 如何将 Node mysql 查询存储在变量中?

mysql - 在备份文件中将 InnoDB 更改为 MyIsam 好吗?

c++ - 在 C++/boost 中将日期时间转换为不同的时区

php - LEFT JOIN 关联返回未知列

mysql - 为每个用户选择有效性

PHP将变量更改为相应类型

php - Yii,php foreach 错误

mysql - 如何在 Laravel 中按关系列进行过滤?