gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-29 21:15:38 25 4
gpt4 key购买 nike

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

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com