在验证触发器中student1_log的id不能为空该这么解决
时间: 2024-03-26 07:40:33 浏览: 26
在验证触发器中,出现 `student1_log` 的 `id` 不能为空的错误,是因为在插入数据时没有为 `id` 字段指定值,而 `id` 字段是主键,且设置了自增属性,因此不能手动为其指定值。
要解决这个问题,我们可以将 `id` 字段的属性修改为 `INT NOT NULL`,并且在插入数据时不指定该字段的值,让数据库自动为其生成自增的值。
修改日志表的 `id` 字段属性:
```
ALTER TABLE Student1_log MODIFY COLUMN id INT NOT NULL;
```
修改触发器:
```
CREATE TRIGGER student1_trigger
AFTER UPDATE ON Student1
FOR EACH ROW
BEGIN
INSERT INTO Student1_log (
new_Sno, old_Sno, new_Sname, old_Sname, new_Sex, old_Sex, new_age, old_age, new_sdept, old_sdept, user
)
VALUES (
NEW.Sno, OLD.Sno, NEW.Sname, OLD.Sname, NEW.Sex, OLD.Sex, NEW.age, OLD.age, NEW.sdept, OLD.sdept, USER()
);
END;
```
这样就能避免 `id` 不能为空的问题了。
相关问题
使用Navicat工具完成触发器student_sc_insert、触发器student_delete和触发器student_sno的创建、查看和删除。
好的,以下是使用 Navicat 工具完成触发器的操作步骤:
1. 创建触发器 `student_sc_insert`:
- 打开 Navicat 工具,选择要操作的数据库,右键点击该数据库,选择“新建 SQL 文件”。
- 在 SQL 文件中输入以下 SQL 语句:
```
CREATE TRIGGER student_sc_insert
AFTER INSERT ON sc
FOR EACH ROW
BEGIN
UPDATE student SET total_credit = total_credit + NEW.credit WHERE sno = NEW.sno;
END;
```
这个触发器会在 `sc` 表插入一条新数据之后执行,更新 `student` 表中对应学生的总学分。
- 点击 SQL 文件顶部的“执行”按钮,执行 SQL 语句,即可创建触发器。
2. 创建触发器 `student_delete`:
- 在 SQL 文件中输入以下 SQL 语句:
```
CREATE TRIGGER student_delete
BEFORE DELETE ON student
FOR EACH ROW
BEGIN
DELETE FROM sc WHERE sno = OLD.sno;
END;
```
这个触发器会在 `student` 表删除一条数据之前执行,删除该学生在 `sc` 表中的所有记录。
- 执行 SQL 语句,即可创建触发器。
3. 创建触发器 `student_sno`:
- 在 SQL 文件中输入以下 SQL 语句:
```
CREATE TRIGGER student_sno
AFTER UPDATE ON student
FOR EACH ROW
BEGIN
IF NEW.sno <> OLD.sno THEN
UPDATE sc SET sno = NEW.sno WHERE sno = OLD.sno;
END IF;
END;
```
这个触发器会在 `student` 表的学号字段更新之后执行。如果新的学号与旧的学号不同,那么它会在 `sc` 表中更新学号。
- 执行 SQL 语句,即可创建触发器。
4. 查看触发器:
- 在 Navicat 工具中,选择要操作的数据库,展开该数据库,选择“触发器”选项卡,即可查看该数据库中所有的触发器。
5. 删除触发器:
- 在 Navicat 工具中,选择要操作的数据库,展开该数据库,选择“触发器”选项卡,找到要删除的触发器。
- 右键点击该触发器,选择“删除”,在弹出的确认对话框中点击“是”,即可删除触发器。
为student_info表建立删除触发器del_s_tr,要求当student_info表的记录被删除后,grade表中相应的记录也能自动删除
可以使用以下 SQL 语句为 `student_info` 表创建删除触发器 `del_s_tr`:
```sql
CREATE TRIGGER del_s_tr
AFTER DELETE ON student_info
FOR EACH ROW
BEGIN
DELETE FROM grade WHERE student_id = OLD.student_id;
END;
```
解释一下上面的代码:
- `AFTER DELETE ON student_info` 表示该触发器会在 `student_info` 表中的记录被删除之后触发。
- `FOR EACH ROW` 表示该触发器会针对每一行记录都触发一次。
- `OLD.student_id` 表示被删除的记录的 `student_id` 字段的值。
触发器中的 SQL 语句会在每次删除 `student_info` 表的记录时,自动删除 `grade` 表中 `student_id` 等于被删除记录 `student_id` 字段值的记录。
相关推荐
![rar](https://img-home.csdnimg.cn/images/20210720083606.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)