在mysql怎么写not deferrable hibernate主键生成策略选则native,如果是ora...

\u6025!!!deferrable initially immediate\u662f\u4ec0\u4e48\u610f\u601d\u5440??

deferrable\uff1a\u8fd9\u4e2a\u9009\u9879\u63a7\u5236\u8be5\u7ea6\u675f\u63a8\u8fdf\u5230\u4e8b\u52a1\u7684\u7ed3\u5c3e\u3002\u5982\u679c\u524d\u9762\u52a0not,\u5c31\u662f\u76f8\u53cd\u7684\u64cd\u4f5c\u4e86\u3002
initially immediate\uff1a\u7acb\u5373\u68c0\u67e5\u7ea6\u675f\uff0c\u5728\u6bcf\u6761\u8bed\u53e5\uff08\u7ed3\u5c3e\uff09\u68c0\u67e5\u7ea6\u675f\uff0c\u8fd9\u662f\u7f3a\u7701\u503c\u3002\u76f8\u53cd\uff0c\u8fd8\u6709\u4e00\u4e2ainitially deferred\u3002
disable\uff1a\u7981\u6b62\u7684\u610f\u601d\u3002
\u8fd9\u4e9b\u90fd\u662f\u5728\u6267\u884cSQL\u65f6\u7684\u4e00\u4e9b\u5f00\u5173\u9009\u9879\u3002

\u53ef\u4ee5\u3002\u7b56\u7565\u5c31\u662fsequence\u3002
\u4f7f\u7528sequence\u3002\u6570\u636e\u5e93\u8981\u6709\u8fd9\u4e2asequence\u624d\u884c\u3002



SEQ_C_T_ARTICLE

在mysql怎么写not deferrable
Oracle约束constraint是我们经常使用的一种数据库规则对象。constraint在数据库中的作用就是从静态角度对数据完整性进行维护。我们经常使用的主键primary key和外键foreign key,本质上就是约束的一种形式。

对Oracle的约束,我们有三个属性可以进行设置,分别为deferrable、deferred和validated。针对不同的需求设计场景,采用不同类型的属性,可以帮助我们实现不同的约束效果。下面我们分别来进行实验。

1、 环境准备

首先我们还是准备数据实验环境。

SQL> create table t (id number);
Table created

SQL> alter table T
2 add constraint c_t_id1
3 check (id>5);

Table altered

我们创建了数据表T,在列id上添加了约束c_t_id1。约束内容很简单,就是要求id值保证是大于5。约束c_t_id1使用的是默认选项,数据字典中对该约束的表示如下:

SQL> select constraint_name, constraint_type ctype, SEARCH_CONDITION cond, STATUS, DEFERRABLE, DEFERRED, VALIDATED from dba_constraints where table_name='T' and wner='SYS';

CONSTRAINT_NAME CTYPE COND STATUS DEFERRABLE DEFERRED VALIDATED
-------------------- ----- ---------- -------- -------------- --------- -------------
C_T_ID1 C id>5 ENABLED NOT DEFERRABLE IMMEDIATE VALIDATED

注意,此时约束的三个属性取值分别为:deferrable: not deferrable;deferred:immediate;validated:validated;

我们观察一下此时数据表的插入现象:

SQL> insert into t values (1); //插入非法的数据;
insert into t values (1)

ORA-02290: 违反检查约束条件 (SYS.C_T_ID1) //立刻报错,将数据剔除!

SQL> insert into t values (6);
1 row inserted

SQL> commit;
Commit complete

SQL> select * from t;

ID
----------
6

结论:在默认情况下,Oracle的约束是不允许延迟(not deferrable)、立即应用和验证的(immediate、validated)。在数据变化的时候,立即进行约束验证。

2、 deferrable:约束应用可以延迟

deferrable默认值为not deferrable,字面含义是不可延迟。那么我们如果设置可以延迟,效果是什么呢?

SQL> alter table T
2 drop constraint C_T_ID1;

Table altered

SQL> alter table T
2 add constraint C_T_ID1
3 check (id>5)
4 deferrable;

Table altered

此时,数据字典中的情况是如下:

SQL> select constraint_name, SEARCH_CONDITION cond, STATUS, DEFERRABLE, DEFERRED, VALIDATED from dba_constraints where table_name='T' and wner='SYS';

CONSTRAINT_NAME CTYPE STATUS DEFERRABLE DEFERRED VALIDATED
-------------------- ----- -------- -------------- --------- -------------
C_T_ID1 C ENABLED DEFERRABLE IMMEDIATE VALIDATED

与默认情况相比,deferrable属性变化为了deferrable。我们观察一下现象:

SQL> insert into t values (3);
insert into t values (3)

ORA-02290: 违反检查约束条件 (SYS.C_T_ID1)

在插入数据的时候,立即进行约束验证。和默认情况下没有差异。那么怎么处理呢?

//手工设置deferred属性为deferred
SQL> set constraint c_t_id1 deferred;
Constraints set

SQL> insert into t values (3); //此时插入数据时候,并不进行验证操作了。
1 row inserted

SQL> insert into t values (7);
1 row inserted

SQL> commit;
commit

ORA-02091: 事务处理已回退
ORA-02290: 违反检查约束条件 (SYS.C_T_ID1) //直到进行commit的时候,才会应用约束;

那么,如何设置回原有的属性呢?

SQL> set constraint c_t_id1 immediate;
Constraints set

SQL> insert into t values (4); //又恢复插入立刻检查约束的状态了?
insert into t values (4)

ORA-02290: 违反检查约束条件 (SYS.C_T_ID1)

结论:单独deferrable的含义就是是否允许约束检查延后进行。单独设置deferrable为deferrable之后,约束检查延后是不可以直接使用的,要配合deferred参数,如果该参数是immediate,那么约束还是在DML的时候进行应用。如果deferred参数设置为deferred,约束就是在事务commit提交的时候应用,出现错误就连带回滚rollback整个事务。

3、 deferred:是否进行延迟应用

从上面的实验中,我们可以看出deferred属性是配合deferrable属性使用的。当deferrable设置为deferrable之后,可以通过set constraints进行deferred属性的设置,来确定约束应用时点。

本部分确定deferred定义的方式和与deferrable属性的关系。是可以在定义约束是使用initially关键字来确定约束的deferred属性取值。

SQL> alter table T
2 add constraint C_T_ID1
3 check (id>5)
4 deferrable initially deferred;

Table altered

扩展阅读:www.sony.com.cn ... mysql下载安装教程 ... mysql自增语句怎么写 ... mysql安装到d盘教程 ... 怎么把mysql从c移动到d ... 中英文自动翻译器 ... mysql基本命令大全 ... python in not in ... mysql not in用法 ...

本站交流只代表网友个人观点,与本站立场无关
欢迎反馈与建议,请联系电邮
2024© 车视网