商品(编号,品名,进价,库存,售价,厂商编号) 顾客(卡号,姓名,电话,积分)厂商(编号,厂址,名称、电话)销售(顾客卡号,商品编号,数量,日期)建立商品的delete 触发器,只有当此商品没有人买时才可删除,若有销售记录不能删除。
时间: 2023-11-24 18:07:26 浏览: 156
可以使用以下SQL语句创建一个触发器,实现删除商品时的限制:
```sql
CREATE TRIGGER delete_product
BEFORE DELETE ON 商品
FOR EACH ROW
BEGIN
DECLARE sales_count INT;
SELECT COUNT(*) INTO sales_count FROM 销售 WHERE 商品编号 = OLD.编号;
IF sales_count > 0 THEN
SIGNAL SQLSTATE '45000' SET MESSAGE_TEXT = '该商品已有销售记录,不能删除!';
END IF;
END;
```
这个触发器会在删除商品之前被触发,查询销售表中是否有与该商品相关的销售记录,如果有,则抛出一个SQL异常,阻止该商品的删除操作。如果没有销售记录,则允许商品被删除。
相关问题
商品(编号,品名,进价,库存,售价,厂商编号) 顾客(卡号,姓名,电话,积分)厂商(编号,厂址,名称、电话)销售(顾客卡号,商品编号,数量,日期)根据上面基本表的信息定义一个存储过程,完成下面功能:入
库商品并更新库存信息,同时更新顾客积分信息。
存储过程如下:
```
CREATE PROCEDURE sp_add_stock_and_update_customer_points
@product_id INT,
@quantity INT,
@customer_id INT
AS
BEGIN
-- 获取商品信息
DECLARE @product_cost FLOAT, @product_price FLOAT, @manufacturer_id INT
SELECT @product_cost = 进价, @product_price = 售价, @manufacturer_id = 厂商编号 FROM 商品 WHERE 编号 = @product_id
-- 更新商品库存
UPDATE 商品 SET 库存 = 库存 + @quantity WHERE 编号 = @product_id
-- 计算顾客积分
DECLARE @points INT
SELECT @points = FLOOR(@product_price * @quantity / 10) FROM 商品 WHERE 编号 = @product_id
-- 更新顾客积分
UPDATE 顾客 SET 积分 = 积分 + @points WHERE 卡号 = @customer_id
END
```
该存储过程接收三个参数:商品编号、数量、顾客卡号。它首先获取商品的进价、售价和厂商编号,并将商品库存增加指定数量。然后,它根据购买的商品数量和单价计算顾客应该获得的积分,并将积分添加到顾客的积分中。
注意,这个存储过程只更新商品库存和顾客积分,不涉及销售信息。如果需要记录销售信息,可以在存储过程中添加相应的 INSERT 语句。
商品(编号,品名,进价,库存,售价,厂商编号) 顾客(卡号,姓名,电话,积分)厂商(编号,厂址,名称、电话)销售(顾客卡号,商品编号,数量,日期)根据上面基本表的信息完成下列查询。1 查询积分最高的顾客姓名2 查询销售数量1000以上的商品的厂商电话。3 查询生产商品5种以上的厂商信息。4 查询没有顾客买的商品信息。
1. 查询积分最高的顾客姓名
```
SELECT 姓名 FROM 顾客 ORDER BY 积分 DESC LIMIT 1;
```
2. 查询销售数量1000以上的商品的厂商电话
```
SELECT DISTINCT 厂商.电话 FROM 商品
INNER JOIN 销售 ON 商品.编号 = 销售.商品编号
INNER JOIN 厂商 ON 商品.厂商编号 = 厂商.编号
WHERE 销售.数量 >= 1000;
```
3. 查询生产商品5种以上的厂商信息
```
SELECT 厂商.编号, 厂商.厂址, 厂商.名称, 厂商.电话 FROM 厂商
INNER JOIN 商品 ON 厂商.编号 = 商品.厂商编号
GROUP BY 厂商.编号
HAVING COUNT(DISTINCT 商品.品名) >= 5;
```
4. 查询没有顾客买的商品信息
```
SELECT 商品.* FROM 商品
LEFT JOIN 销售 ON 商品.编号 = 销售.商品编号
WHERE 销售.商品编号 IS NULL;
```
阅读全文