时间:2021-07-01 10:21:17 帮助过:22人阅读
在对表的定义中,使用了REFERENCES关键字,它表示cust_id中的任何值都必须是customers表中的cust_id中的值。
22.1.3 唯一约束
唯一约束用来保证一列中的数据是唯一的。类似于主键,但存在下列区别:
比如我们在注册账号的时候,需要填上用户的邮箱,每个人的邮箱都不一样,但是我们一般不会考虑把邮箱作为主键,而是定义用户ID作为主键。为了保证邮箱唯一,可以在邮箱列上定义UNIQUE约束做到。
22.1.4 检查约束
MySQL不支持这里不做详细介绍。
22.2 索引
索引用来排序数据以加快搜索和排序操作的速度。
在创建索引之前,应该了解:
索引用CREATE INDEX语句创建。
下面的语句就是在products表的产品名列上创建一个简单的索引。
CREATE INDEX prod_nume_ind
ON products (prod_nume);
索引必须唯一命名。这里的索引名是prod_name_ind 在关键字 CREATE INDEX 之后定义。ON用来指定被索引的表,而索引中包含的列在表名后的圆括号中给出。
22.3 触发器
触发器是特殊的存储过程,在特定的数据库活动发生时自动执行。触发器会在某个表执行以下语句时而自动执行:DELETE、INSERT、UPDATE。
22.3.1 创建触发器
在创建触发器的时候,需要给出4条信息:
例如:
CREATE TRIGGER newproduct AFTER INSERT ON products FOR EACH ROW SELECT ‘product added‘;
CREATE TRIGGER用来创建名为newproduct的新触发器。触发器可在一个操作发生之前或之后执行,这里给出了AFTER INSERT(还有BEFORE),所以此触发器将在INSERT语句成功执行后执行。这个触
发器还指定FOREACH ROW,因此代码对每个插入行执行。在这个例子中,文本Product added将对每个插入的行显示一次。
触发器按每个表每个事件每次地定义,每个表每个事件每次只允许一个触发器。因此,每个表最多支持6个触发器(每条INSERT、 UPDATE和DELETE的之前和之后)。
22.3.2 删除触发器
为了删除一个触发器,可使用DROP TRIGGER语句,如下所示:
DROP TRIGGER newproduct;
22.3.3 INSERT触发器
INSERT触发器在INSERT语句执行之前或之后执行。
CREATE TRIGGER neworder AFTER INSERT ON orders
FOR EACH ROW SELECT NEW.order_num;
此代码创建一个名为neworder的触发器,它按照AFTER INSERT ON orders执行。在插入一个新订单到orders表时, MySQL生成一个新订单号并保存到order_num中。触发器从NEW. order_num取得这个值
并返回它。对于orders的每次插入使用这个触发器将总是返回新的订单号。
为测试这个触发器,试着插入一下新行,如下所示:
INSERT INTO orders(order_date, cust_id) VALUES(Now(), 10001);
22.3.4 DELETE触发器
DELETE触发器在DELETE语句执行之前或之后执行。
看这样的例子:
CREATE INTO deleteorder BEFORE DELETE ON orders
FOR EACH ROW
BEGIN
INSERT INTO achieve_orders(order_num, order_date, cust_id)
VALUES(OLD.order_date, OLD.cust_id);
END;
在任意订单被删除前将执行此触发器。它使用一条INSERT语句将OLD中的值(要被删除的订单)保存到一个名为archive_orders的存档表中(为实际使用这个例子,需要用与orders相同的列创建一个名为
archive_orders的表)。
22.3.5 UPDATE触发器
UPDATE触发器在UPDATE语句执行之前或之后执行。
看这样一个例子:
CREATE TRIGGER updatevendor BEFORE UPDATE ON vendors
FOR EACH ROW SET NEW.vend_state = Upper( NEW.vend_state );
每次更新一个行时,NEW.vend_state中的值都用Upper(NEW.vend_state)替换。
22 高级SQL特性
标签:响应 使用 因此 2.3 速度 time 需要 活动 after