SQL_STUDY:9.SQL DEFAULT 约束和create index 语句

本文深入探讨了SQL中的DEFAULT约束和createindex语句的使用方法。DEFAULT约束用于向列中插入默认值,确保在未指定值时自动填充。createindex语句则用于创建索引,提高数据检索速度,包括简单索引和唯一索引的创建,以及如何在多个列上创建索引。

摘要:

  1. DEFAULT 约束
  2. create index 语句

SQL DEFAULT 约束

DEFAULT 约束用于向列中插入默认值。

如果没有规定其他的值,那么会将默认值添加到所有的新记录。

SQL DEFAULT Constraint on CREATE TABLE

下面的 SQL 在 “Persons” 表创建时为 “City” 列创建 DEFAULT 约束:

My SQL / SQL Server / Oracle / MS Access:

CREATE TABLE Persons
(
Id_P int NOT NULL,
LastName varchar(255) NOT NULL,
FirstName varchar(255),
Address varchar(255),
City varchar(255) DEFAULT 'Sandnes'
)

通过使用类似 GETDATE() 这样的函数,DEFAULT 约束也可以用于插入系统值

CREATE TABLE Orders
(
Id_O int NOT NULL,
OrderNo int NOT NULL,
Id_P int,
OrderDate date DEFAULT GETDATE()
)

SQL DEFAULT Constraint on ALTER TABLE

如果在表已存在的情况下为 “City” 列创建 DEFAULT 约束,请使用下面的 SQL:

MySQL:

ALTER TABLE Persons
ALTER City SET DEFAULT 'SANDNES'

SQL Server / Oracle / MS Access:

ALTER TABLE Persons
ALTER COLUMN City SET DEFAULT 'SANDNES'

撤销 DEFAULT 约束

如需撤销 DEFAULT 约束,请使用下面的 SQL:
MySQL:

ALTER TABLE Persons
ALTER City DROP DEFAULT

SQL Server / Oracle / MS Access:

ALTER TABLE Persons
ALTER COLUMN City DROP DEFAULT

create index 语句

CREATE INDEX 语句用于在表中创建索引。

在不读取整个表的情况下,索引使数据库应用程序可以更快地查找数据。

索引

您可以在表中创建索引,以便更加快速高效地查询数据。

用户无法看到索引,它们只能被用来加速搜索/查询。

注释:更新一个包含索引的表需要比更新一个没有索引的表更多的时间,这是由于索引本身也需要更新。因此,理想的做法是仅仅在常常被搜索的列(以及表)上面创建索引。

SQL CREATE INDEX 语法

在表上创建一个简单的索引。允许使用重复的值:

CREATE INDEX index_name
ON table_name (column_name)

注释:“column_name” 规定需要索引的列。

SQL CREATE UNIQUE INDEX 语法

在表上创建一个唯一的索引。唯一的索引意味着两个行不能拥有相同的索引值。

CREATE UNIQUE INDEX index_name
ON table_name (column_name)

CREATE INDEX 实例

本例会创建一个简单的索引,名为 “PersonIndex”,在 Person 表的 LastName 列:

CREATE INDEX PersonIndex
ON Person (LastName) 
```sql
如果您希望以降序索引某个列中的值,您可以在列名称之后添加保留字 DESC```sql
CREATE INDEX PersonIndex
ON Person (LastName DESC) 

假如您希望索引不止一个列,您可以在括号中列出这些列的名称,用逗号隔开:

CREATE INDEX PersonIndex
ON Person (LastName, FirstName)
-- 1. 首先创建数据库 DROP DATABASE IF EXISTS course_system; CREATE DATABASE course_system CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci; USE course_system; -- 2. 创建用户表 CREATE TABLE users ( user_id INT AUTO_INCREMENT PRIMARY KEY, username VARCHAR(50) UNIQUE NOT NULL, PASSWORD VARCHAR(255) NOT NULL, real_name VARCHAR(50) NOT NULL, ROLE ENUM('student','teacher','admin') NOT NULL, email VARCHAR(100), create_time TIMESTAMP DEFAULT CURRENT_TIMESTAMP ); -- 3. 创建课程表 CREATE TABLE courses ( course_id INT AUTO_INCREMENT PRIMARY KEY, course_name VARCHAR(100) NOT NULL, DESCRIPTION TEXT, teacher_id INT NOT NULL, category VARCHAR(50), STATUS ENUM('draft','published') DEFAULT 'draft', FOREIGN KEY (teacher_id) REFERENCES users(user_id) ); -- 4. 创建章节与作业表(包含video_duration字段) CREATE TABLE chapters ( chapter_id INT AUTO_INCREMENT PRIMARY KEY, course_id INT NOT NULL, chapter_title VARCHAR(100) NOT NULL, TYPE ENUM('video','text','assignment') DEFAULT 'video', content TEXT, assignment_desc TEXT, assignment_deadline DATETIME, max_score INT DEFAULT 100, sort_order INT DEFAULT 0, video_duration INT DEFAULT 0, FOREIGN KEY (course_id) REFERENCES courses(course_id), CHECK (max_score > 0) ); -- 5. 创建学习与提交记录表 CREATE TABLE study_records ( record_id INT AUTO_INCREMENT PRIMARY KEY, user_id INT NOT NULL, chapter_id INT NOT NULL, study_time INT DEFAULT 0, is_completed BOOLEAN DEFAULT FALSE, submit_content TEXT, submit_time TIMESTAMP DEFAULT CURRENT_TIMESTAMP, score DECIMAL(5,2), COMMENT TEXT, grade_time DATETIME, FOREIGN KEY (user_id) REFERENCES users(user_id), FOREIGN KEY (chapter_id) REFERENCES chapters(chapter_id), UNIQUE (user_id, chapter_id) ); -- 6. 创建存储过程 DELIMITER // -- 学生选课并初始化学习记录 CREATE PROCEDURE EnrollStudent(IN p_user_id INT, IN p_course_id INT) BEGIN DECLARE v_chapter_id INT; DECLARE done INT DEFAULT FALSE; DECLARE cur CURSOR FOR SELECT chapter_id FROM chapters WHERE course_id = p_course_id; DECLARE CONTINUE HANDLER FOR NOT FOUND SET done = TRUE; OPEN cur; read_loop: LOOP FETCH cur INTO v_chapter_id; IF done THEN LEAVE read_loop; END IF; -- 使用REPLACE而不是INSERT IGNORE,确保记录存在 REPLACE INTO study_records (user_id, chapter_id, study_time, is_completed) VALUES (p_user_id, v_chapter_id, 0, FALSE); END LOOP; CLOSE cur; -- 返回插入的记录数 SELECT ROW_COUNT() AS records_affected; END // -- 提交作业 CREATE PROCEDURE SubmitAssignment( IN p_user_id INT, IN p_chapter_id INT, IN p_content TEXT ) BEGIN UPDATE study_records SET submit_content = p_content, submit_time = NOW() WHERE user_id = p_user_id AND chapter_id = p_chapter_id; SELECT ROW_COUNT() AS records_updated; END // -- 批改作业 CREATE PROCEDURE GradeAssignment( IN p_user_id INT, IN p_chapter_id INT, IN p_score DECIMAL(5,2), IN p_comment VARCHAR(255) ) BEGIN UPDATE study_records SET score = p_score, COMMENT = p_comment, grade_time = NOW() WHERE user_id = p_user_id AND chapter_id = p_chapter_id; SELECT ROW_COUNT() AS records_updated; END // DELIMITER ; -- 7. 创建触发器 DELIMITER // -- 更新学习记录时自动判断是否完成(视频学习) CREATE TRIGGER tr_check_completion BEFORE UPDATE ON study_records FOR EACH ROW BEGIN DECLARE v_duration INT DEFAULT 0; DECLARE v_type ENUM('video','text','assignment'); SELECT video_duration, TYPE INTO v_duration, v_type FROM chapters WHERE chapter_id = NEW.chapter_id; IF v_type = 'video' AND v_duration > 0 AND NEW.study_time >= v_duration THEN SET NEW.is_completed = TRUE; END IF; END // DELIMITER ; -- 8. 创建视图 -- 学生学习进度视图 CREATE VIEW student_progress AS SELECT u.real_name AS 学生姓名, c.course_name AS 课程名称, COUNT(sr.record_id) AS 已学章节数, SUM(sr.study_time) AS 总学习时长, AVG(sr.is_completed) AS 完成率 FROM users u JOIN study_records sr ON u.user_id = sr.user_id JOIN chapters ch ON sr.chapter_id = ch.chapter_id JOIN courses c ON ch.course_id = c.course_id WHERE u.role = 'student' GROUP BY u.user_id, c.course_id; -- 作业提交情况视图 CREATE VIEW assignment_submission_status AS SELECT ch.chapter_title AS 作业名称, COUNT(sr.record_id) AS 提交人数, AVG(sr.score) AS 平均分 FROM chapters ch LEFT JOIN study_records sr ON ch.chapter_id = sr.chapter_id WHERE ch.type = 'assignment' GROUP BY ch.chapter_id; -- 9. 插入测试数据 -- 插入用户 INSERT INTO users (username, PASSWORD, real_name, ROLE, email) VALUES ('stu1', '123456', '学生一', 'student', 'stu1@edu.com'), ('tea1', '123456', '教师一', 'teacher', 'tea1@edu.com'); -- 插入课程 INSERT INTO courses (course_name, DESCRIPTION, teacher_id, category, STATUS) VALUES ('Python入门', 'Python基础语法', 2, '编程', 'published'); -- 插入章节(包含video_duration) INSERT INTO chapters (course_id, chapter_title, TYPE, content, sort_order, video_duration) VALUES (1, '第一章:Hello World', 'video', 'https://example.com/py1.mp4', 1, 300), (1, '第二章:变量与数据类型', 'text', 'Python中的变量...', 2, 0), (1, '第一次作业', 'assignment', '完成3道基础编程题', 100, 3); -- 10. 测试存储过程触发器 -- 测试选课(先检查存储过程是否正常工作) CALL EnrollStudent(1, 1); -- 验证学习记录是否创建成功 SELECT '验证学习记录创建' AS test_step; SELECT * FROM study_records WHERE user_id = 1; -- 测试作业提交 CALL SubmitAssignment(1, 3, 'test answer'); -- 测试批改作业 CALL GradeAssignment(1, 3, 95, '很好!'); -- 更新学习时长,触发自动完成判断 UPDATE study_records SET study_time = 600 WHERE user_id = 1 AND chapter_id = 1; -- 11. 验证结果 -- 查询学习记录,is_completed应为TRUE(因为600 > 300) SELECT '验证触发器效果' AS test_step; SELECT study_time, is_completed FROM study_records WHERE user_id = 1 AND chapter_id = 1; -- 12. 查看视图数据 SELECT '查看学生进度视图' AS test_step; SELECT * FROM student_progress; SELECT '查看作业提交情况视图' AS test_step; SELECT * FROM assignment_submission_status; 检查这段代码
最新发布
11-21
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值