11. SQL -- 约束、Check、触发器的执行顺序

让我们看看约束、 Check 和触发器在这个过程中的先后顺序,或许能加深些对事务的理解。

CREATE TABLE TestTable

(

ID         INT    CONSTRAINT PK_TestTable_id PRIMARY KEY,

UniqueID   INT    UNIQUE,

Number     INT    CHECK (Number >= 10 AND Number<=100),

NonNULL    INT    NOT NULL

);

CREATE TABLE LogTable

(

LogDesc    VARCHAR(50),

LogDate    DATETIME

);

CREATE TRIGGER [TRI_TestTable] ON TestTable

AFTER INSERT,UPDATE

AS

INSERT INTO LogTable VALUES(‘TestTable‘,GETDATE());

验证步骤,第一步插入新值, OK

INSERT INTO TestTable(ID,UniqueID,Number,NonNULL) VALUES(1,1,11,10);

插入一条不满足所以约束和 Check 条件的记录,提示不能将值 NULL 插入列 ‘NonNULL‘

INSERT INTO TestTable(ID,UniqueID,Number,NonNULL) VALUES(1,1,1,NULL);

把 NULL 值修改为 10 ,继续插入,提示违反了 PRIMARY KEY 约束 ‘PK_TestTable_id‘

INSERT INTO TestTable(ID,UniqueID,Number,NonNULL) VALUES(1,1,1,10);

把 ID 从 1 改为修改为 2 ,继续插入,提示违反了 UNIQUE KEY 约束 ‘UQ__TestTable__023D5A04‘

INSERT INTO TestTable(ID,UniqueID,Number,NonNULL) VALUES(2,1,1,10);

把 UniqueID 从 1 改为修改为 2 ,继续插入,提示 NSERT 语句与 CHECK 约束 "CK__TestTable__Numbe__03317E3D" 冲突

INSERT INTO TestTable(ID,UniqueID,Number,NonNULL) VALUES(2,2,1,10);

把 Number 从 1 改成 11 ,插入 OK

INSERT INTO TestTable(ID,UniqueID,Number,NonNULL) VALUES(2,2,11,10);

注意以上只有执行成功后,才会执行触发器;而如果某个环节失败,整个事务回滚。

再次修改触发器,注意本处是把 Number 设置为 1 ,来判断触发器执行后,是否仍需要进行 Check 和约束判断

ALTER TRIGGER [TRI_TestTable] ON TestTable

AFTER INSERT,UPDATE

AS

DECLARE @ID INT,@UniqueID INT,@Number INT,@NonNULL INT

SELECT @ID=ID,@UniqueID=UniqueID,@Number=Number,@NonNULL=NonNULL

FROM INSERTED

SET @Number=1

SET @NonNULL=NULL

INSERT INTO LogTable VALUES(‘TestTable‘,GETDATE());

UPDATE TestTable SET [email protected],[email protected] WHERE [email protected]

再执行符合所有约束和 Check 条件的语句

INSERT INTO TestTable(ID,UniqueID,Number,NonNULL) VALUES(3,3,10,10);

提示消息 515 ,级别 16 ,状态 2 ,过程 TRI_TestTable ,第 9 行

不能将值 NULL 插入列 ‘NonNULL‘ ,表 ‘test.dbo.TestTable‘ ;列不允许有空值。 UPDATE 失败。

SELECT * FROM TestTable

SELECT * FROM LogTable

由此可以看出

Insert 语句执行时首先验证约束,同时约束本身也有先后顺序

1 、验证非空约束

2 、验证主键约束

3 、验证唯一性约束

再次验证相关 Check

最后执行触发器,如果触发器中也必须保证不违反相关约束和 Check

时间: 2024-08-26 09:57:44

11. SQL -- 约束、Check、触发器的执行顺序的相关文章

Oracle EBS中有关Form的触发器的执行顺序

http://blog.csdn.net/postfxj/article/details/8135769 触发器执行顺序: 1.  当打开FORM时: (1)       PRE-FORM (2)       PRE-BLOCK(BLOCK级) (3)       WHEN-NEW-FORM-INSTANCE (4)       WHEN-NEW-BLOCK-INSTANCE (5)       WHEN-NEW-RECORD-INSTANCE (6)       WHEN-NEW-ITEM-I

SQL Select语句完整的执行顺序

SQL Select语句完整的执行顺序: 1.from子句组装来自不同数据源的数据: 2.where子句基于指定的条件对记录行进行筛选: 3.group by子句将数据划分为多个分组: 4.使用聚集函数进行计算: 5.使用having子句筛选分组: 6.计算所有的表达式: 7.select 的字段:8.使用order by对结果集进行排序.SQL语言不同于其他编程语言的最明显特征是处理代码的顺序.在大多数据库语言中,代码按编码顺序被处理.但在SQL语句中,第一个被处理的子句式FROM,而不是第一

sql的基础知识之执行顺序

总结sql的执行顺序: (8)SELECT (9)DISTINCT  (11)<Top Num> <select list> (1)FROM [left_table] (3)<join_type> JOIN <right_table> (2)ON <join_condition> (4)WHERE <where_condition> (5)GROUP BY <group_by_list> (6)WITH <CUBE 

SQL 语句与性能之执行顺序

select * , t3.Name from t1 left join t2 on t1.sysno = t2.Asysno left join t3 on t3.sysno = t2.Bsysno 上面SQL语句中,t3表数据很多;此时查询t3.Name会很慢,如果把t3和name干掉,秒中就能查询出数据,这样就有了这种sql select * , (select top 1 name from t3 where sysno =t2.Bsysno)Name from t1 left join

SQL 中 SELECT 语句的执行顺序

好像自已在书写 SQL 语句时由于不清楚各个关键字的执行顺序, 往往组织的 SQL 语句缺少很好的逻辑, 凭感觉 "拼凑" ( 不好意思, 如果您的 SQL 语句也经常 "拼凑", 那您是不是得好好反省一下呢?, 呵呵). 确实是爽了自己, 可苦了机器, 服务器还需要在我们的杂乱无章的 SQL 语句中寻找它下一句需要执行的关键字在哪里. 效率嘛, 由于我们的感觉神经对秒以下的变化实在不敏感, 暂且就认为自已写的 SQL 顺序无关紧要, "反正没什么变化!&

PL/SQL的if语句的执行顺序

PL/SQL的if语句的语法定义如下: IF condition THEN {...statements...} ELSIF condition THEN {...statements...} ELSE {...statements...} END IF; 由于PL/SQL不像高级语言,没有大括号,如果statements中包含了多个操作,这些操作是否都会执行呢? 下面写了一个函数做一个实验,来验证if语句的执行顺序: <span style="font-size:18px;"&

SQL查询中关键词的执行顺序

1.查询中常用到的关键词有: SELECT.FROM.WHERE.GROUP BY.HAVING.ORDER BY 其中,SELECT与FROM是必需的,其他关键词则是可选的. 2.这些关键词的书写顺序: SELECT 字段列表 FROM 表名 WHERE 记录筛选条件 GROUP BY 分组字段列表 HAVING 分组筛选条件 ORDER BY 排序字段列表 3.WHERE与HAVING的区别: WHERE是对记录进行筛选:而HAVING是对按GROUP BY进行分组后的组进行筛选. HAVI

SQL 语句的执行顺序

写在前面的话:有时不理解SQL语句各个部分执行顺序,导致理解上出现偏差,或者是书写SQL语句时随心所欲,所以有必要了解一下sql语句的执行顺序.可以有时间自己写一个简单的数据库,理解会更加深入.下面就写写我的一些理解,以SQL SERVER2008为例,进行说明. 先看下面这条简单SQL语句: 1 select 2 top 10 * 3 from Student 4 where age>20 这条SQL语句是否可以有下面两种理解呢 (1)先从Student表中选出age>20的数据,然后从这些

容易被忽略的事----sql语句中select语句的执行顺序

关于Sql中Select语句的执行顺序,一直很少注意这个问题,对于关键字的使用也很随意,至于效率问题,因为表中的数据量都不是很大,所以也不是很在意. 今天在一次面试的时候自己见到了,感觉没一点的印象,所以也就没有答上来,现在整理一下吧,希望提醒自己,也能够帮到其他的朋友.如下: (8) SELECT (9)DISTINCT (11) <TOP_specification> <select_list> (1) FROM <left_table> (3) <join_