2015-08-15 27 views
0

我想在客户订单创建触发器数据库,在那里每个客户都有几个数量级和每个订单都有几个项目INSERT触发器:问题与constarint

我打算创建一个触发器,以确保

所有订单的地方通过同一客户的总数不能 超过10000

如何上面创建INSERT触发器约束。

这是我提供的示例数据的SQL文件。

CREATE SCHEMA IF NOT EXISTS `mydb` DEFAULT CHARACTER SET utf8 COLLATE utf8_general_ci ; 
USE `mydb` ; 


CREATE TABLE customers 
(`id` int not null auto_increment primary key, `first_name` varchar(64), `last_name`varchar(64)); 

INSERT INTO customers(`first_name`, `last_name`)VALUES('Jhon', 'Doe'); 

CREATE TABLE items 
(`id` int not null auto_increment primary key,`item` varchar(64),`price` decimal(19,2)); 

INSERT INTO items(`item`, `price`)VALUES('Item1', 10.5),('Item2', 25); 

CREATE TABLE orders 
(`id` int not null auto_increment primary key, `date` date, `customer_id` int,`status` int not null default 1, -- 1 new constraint fk_customer_id foreign key (customer_id) references customers (id)); 

INSERT INTO orders(`date`, `customer_id`, `status`)VALUES(CURDATE(), 1, 1); 

CREATE TABLE order_items(`id` int not null auto_increment primary key, 
`order_id` int not null, `item_id` int not null, `quantity` decimal(19,3) not null, `price` decimal(19,3) not null, 
constraint fk_order_id foreign key (order_id) references orders (id), 
constraint fk_item_id foreign key (item_id) references items (id)); 

INSERT INTO order_items(`order_id`, `item_id`, `quantity`, `price`)VALUES 
(1, 1, 2, 10.5),(1, 2, 4, 25); 

;

任何帮助,非常感谢。

+0

我正在使用MySQL数据库 – webtale

+0

您可以使用检查约束,而不是触发器 –

+0

为什么在触发器中。考虑不允许插入呼叫。更好的是,当他们点击下订单时,发出通知“你不能下订单,你已经从我们这里买了太多” – Drew

回答

1

虽然Jahul的答案将在技术上的工作,这里是替代逻辑:

DELIMITER $$ 
CREATE TRIGGER `customer_orders_check` 
BEFORE INSERT ON `orders` FOR EACH ROW 
BEGIN 
    IF ((select count(*) 
     from `orders` 
     where a.customer_id = NEW.customer_id 
     ) >= 10000 THEN 
     SIGNAL SQLSTATE '45000' SET MESSAGE_TEXT = 'Too many orders already'; 
    END IF; 

END; 
$$ 
DELIMITER ; 

这就是说,我会建议另一种方法。每个插入计数高达10,000行看起来像很多工作。相反,使用后插入触发器(也可能在更新/删除之后)将计数器保留在customers表中。然后当插入一个新的行时,你可以检查客户的数量。

0

该触发器将停止插入 -

CREATE TRIGGER `customer_orders_check` 
BEFORE INSERT ON `orders` FOR EACH ROW 
BEGIN 

IF exists(select count(*) 
    from `orders` a 
    where a.customer_id= NEW.customer_id 
    having count(*)>=10000) THEN 
SET NEW.id = 1 ; 
END IF; 

END; 
+1

返回使用[SIGNAL:作为“返回”错误的方式](https://dev.mysql.com/doc/refman/5.5/en/signal.html)返回指示确切信息会更有用错误? –