赞
踩
在SQL面笔试中,对于表的连接方式,过滤条件,窗口函数等肯定是考察的重中之重,但是有一些偶尔会出现,频率比较低但是至少几乎会遇见一两次的题目,就比如触发器,索引和外键约束,此类题目实际操作过或者专门记忆过就会,否则肯定是无从下手,因为此类题目几乎就是背诵式的题目,那么接下来列举几道此类型的题目。
现有一张试卷信息表examination_info,其中包含各种类型试卷的信息。为了对表更方便快捷地查询,需要在examination_info表创建以下索引,规则如下:
在duration列创建普通索引idx_duration、在exam_id列创建唯一性索引uniq_idx_exam_id、在tag列创建全文索引full_idx_tag。
根据题意,将返回如下结果:
- drop table if exists examination_info;
- CREATE TABLE IF NOT EXISTS examination_info (
- id int PRIMARY KEY AUTO_INCREMENT COMMENT '自增ID',
- exam_id int UNIQUE NOT NULL COMMENT '试卷ID',
- tag varchar(32) COMMENT '类别标签',
- difficulty varchar(8) COMMENT '难度',
- duration int NOT NULL COMMENT '时长',
- release_time datetime COMMENT '发布时间'
- )CHARACTER SET utf8 COLLATE utf8_bin;
- create index idx_duration on examination_info(duration);
- create unique index uniq_idx_exam_id on examination_info(exam_id);
- create fulltext index full_idx_tag on examination_info(tag);
create方式创建索引:
- CREATE
- [UNIQUE -- 唯一索引
- | FULLTEXT -- 全文索引
- ] INDEX index_name ON table_name -- 不指定唯一或全文时默认普通索引
- (column1[(length) [DESC|ASC]] [,column2,...]) -- 可以对多列建立组合索引
alter方式创建索引:
- ALTER TABLE tb_name ADD [UNIQUE | FULLTEXT] [INDEX] index_content(content)
-
drop方式删除索引:
DROP INDEX <索引名> ON <表名>
alter方式删除索引:
ALTER TABLE <表名> DROP INDEX <索引名>
在audit表上创建外键约束,其emp_no对应employees_test表的主键id。
(以下2个表已经创建了)
- CREATE TABLE employees_test(
- ID INT PRIMARY KEY NOT NULL,
- NAME TEXT NOT NULL,
- AGE INT NOT NULL,
- ADDRESS CHAR(50),
- SALARY REAL
- );
-
- CREATE TABLE audit(
- EMP_no INT NOT NULL,
- create_date datetime NOT NULL
- );
后台会判断是否创建外键约束,创建输出1,没创建输出0
- drop table if exists audit;
- drop table if exists employees_test;
- CREATE TABLE employees_test(
- ID INT PRIMARY KEY NOT NULL,
- NAME TEXT NOT NULL,
- AGE INT NOT NULL,
- ADDRESS CHAR(50),
- SALARY REAL
- );
-
- CREATE TABLE audit(
- EMP_no INT NOT NULL,
- create_date datetime NOT NULL
- );
-
- 输出:
- 1

- alter table audit
- add constraint foreign key (emp_no)
- references employees_test (id);
- 创建外键语句结构:
- ALTER TABLE <表名>
- ADD CONSTRAINT FOREIGN KEY (<列名>)
- REFERENCES <关联表>(关联列)
构造一个触发器audit_log,在向employees_test表中插入一条数据的时候,触发插入相关的数据到audit中。
- CREATE TABLE employees_test(
- ID INT PRIMARY KEY NOT NULL,
- NAME TEXT NOT NULL,
- AGE INT NOT NULL,
- ADDRESS CHAR(50),
- SALARY REAL
- );
- CREATE TABLE audit(
- EMP_no INT NOT NULL,
- NAME TEXT NOT NULL
- );
- 后台会往employees_test插入一条数据:
- INSERT INTO employees_test (ID,NAME,AGE,ADDRESS,SALARY)VALUES (1, 'Paul', 32, 'California', 20000.00 );
- 然后从audit里面使用查询语句:
- select * from audit;
- drop table if exists audit;
- drop table if exists employees_test;
-
- CREATE TABLE employees_test(
- ID INT PRIMARY KEY NOT NULL,
- NAME TEXT NOT NULL,
- AGE INT NOT NULL,
- ADDRESS CHAR(50),
- SALARY REAL
- );
- CREATE TABLE audit(
- EMP_no INT NOT NULL,
- NAME TEXT NOT NULL
- );
- create trigger audit_log after insert on employees_test
- for each row
- begin
- insert into audit values(NEW.ID,NEW.NAME);
- end
- 在MySQL中,创建触发器语法如下:
- CREATE TRIGGER trigger_name
- trigger_time trigger_event ON tbl_name
- FOR EACH ROW
- trigger_stmt
- 其中:
-
- trigger_name:标识触发器名称,用户自行指定;
- trigger_time:标识触发时机,取值为 BEFORE 或 AFTER;
- trigger_event:标识触发事件,取值为 INSERT、UPDATE 或 DELETE;
- tbl_name:标识建立触发器的表名,即在哪张表上建立触发器;
- trigger_stmt:触发器程序体,可以是一句SQL语句,或者用 BEGIN 和 END 包含的多条语句,每条语句结束要分号结尾。
- 【NEW 与 OLD 详解】
- MySQL 中定义了 NEW 和 OLD,用来表示
- 触发器的所在表中,触发了触发器的那一行数据。
- 具体地:
-
- 在 INSERT 型触发器中,NEW 用来表示将要(BEFORE)或已经(AFTER)插入的新数据;
- 在 UPDATE 型触发器中,OLD 用来表示将要或已经被修改的原数据,NEW 用来表示将要或已经修改为的新数据;
- 在 DELETE 型触发器中,OLD 用来表示将要或已经被删除的原数据;
- 使用方法: NEW.columnName (columnName 为相应数据表某一列名)

[1] 牛客 webary 题解 | #SQL 12.创建索引#
[2] 牛客 webary高质量搬砖人 SQL 46) -ADD CONSTRAINT FOREIGN KEY 创建外键约束
[3] CSDN 白色爬虫 MySQL数据库触发器讲解与案例
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。