为什么我学的触发器是create trigger trigger_name on table_name for insert
时间: 2024-03-14 20:44:48 浏览: 62
您学习的触发器语法是旧版本的 SQL Server 触发器语法,适用于 SQL Server 2000 和更早的版本。在 SQL Server 2005 和之后的版本中,触发器语法发生了变化,变成了如下的形式:
```
CREATE TRIGGER trigger_name
{BEFORE | AFTER} {INSERT | UPDATE | DELETE} ON table_name
[FOR EACH ROW]
trigger_body
```
这种语法与您提到的旧版本语法有所不同,主要在于 `create trigger` 和 `on` 关键字的去除,以及 `for` 关键字的替换为 `before` 或 `after` 等。新版本的语法更加简洁、易于理解和使用,同时也增加了一些新特性,如支持 `INSTEAD OF` 触发器等。
因此,建议您尽量使用新版本的触发器语法,以便更好地适应现代的数据库开发需求。
相关问题
DROP TRIGGER if exists `user_insert_trigger`; CREATE TRIGGER user_insert_trigger BEFORE INSERT ON users FOR EACH ROW BEGIN UPDATE users SET user_name = NEW.user_name WHERE user_name = OLD.user_name; END;这个触发器的代码示例存在问题吗
这个触发器的代码示例存在一些问题:
1. 在触发器中使用 UPDATE 语句更新同一个表,会导致触发器递归执行,最终导致死循环。因此,这个触发器中的 UPDATE 语句需要修改为对另一张表的操作,或者使用 INSERT INTO ... SELECT ... 语句来插入新的记录。
2. 在 UPDATE 语句中,WHERE 子句中使用了 OLD.user_name,这是不正确的,因为触发器执行前还没有插入新的记录,所以 OLD.user_name 是不存在的。正确的做法是使用 NEW.user_name 来替代 OLD.user_name。
因此,修正后的触发器代码应该是这样的:
```
DROP TRIGGER IF EXISTS `user_insert_trigger`;
CREATE TRIGGER user_insert_trigger
BEFORE INSERT ON users
FOR EACH ROW
BEGIN
UPDATE another_table SET user_name = NEW.user_name WHERE user_id = NEW.user_id;
END;
```
其中,`another_table` 是另一张表,用来存储用户信息。`user_id` 是 users 表中的主键,用来关联两张表。这样,当新的用户记录插入到 users 表时,触发器会自动更新另一张表中对应用户的 user_name 值。
解释一下:CREATE trigger test_trigger on test_table for insert as update test_table set name =substring('FM'+stuff('00000',5-len(i.id)+1,len(i.id),CAST(i.id AS char(5))),1,7) from inserted i where i.id=test_table.id GO
这是一个 SQL Server 的触发器,当 test_table 表中插入新数据时,会触发 test_trigger 这个触发器。触发器会将插入的数据的 id 字段转换成一个以 FM 开头,总共 7 位的字符串,并更新 test_table 表中对应的记录的 name 字段。具体的转换过程是:将 id 转换成一个长度为 5 的字符串,不足 5 位的在前面补 0,然后将这个字符串插入到 FM 的后面,最后截取前 7 位作为 name 字段的值。
阅读全文