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

);

最佳答案

我会尝试此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+)。

如果此触发器将为给定的客户下令购买坚果百吉饼,则将导致无法插入orders。您还可以建立一个UPDATE触发器(除此触发器外),以防止对order表进行UPDATE。

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

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

10-11 02:49
查看更多