十年网站开发经验 + 多家企业客户 + 靠谱的建站团队
量身定制 + 运营维护+专业推广+无忧售后,网站问题一站解决
禁用所有外键约束
在绵阳等地区,都构建了全面的区域性战略布局,加强发展的系统性、市场前瞻性、产品创新能力,以专注、极致的服务理念,为客户提供做网站、成都网站制作 网站设计制作定制网站建设,公司网站建设,企业网站建设,成都品牌网站建设,成都全网营销,成都外贸网站建设,绵阳网站建设费用合理。
Sql代码
select 'alter table '||table_name||' disable constraint '||constraint_name||';' from user_constraints where constraint_type='R'
启用所有外键约束
Sql代码
select 'alter table '||table_name||' enable constraint '||constraint_name||';' from user_constraints where constraint_type='R'
查看表的约束条件有三个视图:
1、dba_constraints、all_constraints、user_constraints。
2、其中:dba_constraints视图需要DBA权限才能查询。
3、all_constraints、user_constraints普通用户查询。
扩展资料:
Oracle数据库使用约束(constraints)来防止无效的数据进入表中,保护数据的实体完整行约束定义在表级,如果表与表之间有从属关系,约束可以防止表的删除,通过约束字段,强制用户在插入更新和删除数据时必须遵循一定的规则。
约束定义语法: create table 表名(字段名 数据类型 约束类型) 或 create table 表名(字段名1 数据类型,字段名2,数据类型 constraints 约束别名 约束类型 (字段))
ORACLE约束总结
你对ORACLE约束的了解如何?比较模糊还是相当透彻?如果你对下面几个问题了如指掌的话,恭喜你,你已经对约束掌握得比较好了,不用看这篇文章了。ORACLE的约束有啥功能作用? 有哪些类型约束(不同版本ORACLE是否不同)?视图有约束吗?约束是否会影响SQL性能? 约束信息存储在哪些系统视图、数据字典中?约束能否修改名称?能否禁用约束?延迟约束有啥好处.......
约束定义
约束是强加在表上的规则或条件。确保数据库满足业务规则。保证数据的完整性。当对表进行DML或DDL操作时,如果此操作会造成表中的数据违反约束条件或规则的话,系统就会拒绝执行这个操作。约束可以是列一级别的 也可以是表级别的。定义约束时没有给出约束的名字,ORACE系统将为该约束自动生成一个名字,其格式为SYS_Cn,其中n为自然数(强烈建议各位在创建表或增加约束时,给约束定义名称。).
约束功能
约束的功能:实现一些业务规则,防止无效的垃圾数据进入数据库,维护数据库的完整性(完整性指正确性与一致性)。从而使数据库的开发和维护都更加容易。
约束分类
约束分为6类: 非空(NOT NULL)约束、 唯一(UNIQUE)约束、主键(PRIMARY KEY)约束、外键(FOREIGN KEY)约束、条件(CHECK)约束、REF约束。
非空(NOT NULL)约束:顾名思义,所约束的列不能为NULL值。否则就会报错
唯一(UNIQUE)约束:在表中每一行中所定义的这列或这些列的值都不能相同。必须保证唯一性。否则就会违法约束条件。
主键(PRIMARY KEY)约束:唯一的标识表中的每一行,不能重复,不能为空。 创建主键或唯一约束后,ORACLE会自动创建一个与约束同名的索引(UNIQUENES为UNIQUE唯一索引)。需要注意的是:每个表只能有且有一个主键约束。
外键(FOREIGN KEY)约束:用来维护从表(Child Table)和主表(Parent Table)之间的引用完整性. 外键约束是个有争议性的约束,它一方面能够维护数据库的数据一致性,数据的完整性。防止错误的垃圾数据入库; 另外一方面它会增加表插入、更新等SQL性能的额外开销,不少系统里面通过业务逻辑控制来取消外键约束。例如在数据仓库中,就推荐禁用外键约束。
条件(CHECK)约束:表中每行都要满足该约束条件。条件约束既可以在表一级定义也可以在列一级定义。在一列上可以定义任意多个条件约束。
REF约束的定义:REF column by definition references an object in another object type or in a relational table. A REF constraint lets you further describe the relationship between the REF column and the object it references.
ORACLE 11 数据库的约束类型如下:
ORACLE 10 数据库的约束类型如下:
在oracle 官方文档下
C(check constraint on a table)
P(primary key)
U(unique key)
R(referential integrity)
V(with check option, on a view)
O(with read only, on a view)
CCheck constraint on a table
PPrimary key
UUnique key
RReferential integrity
VWith check option, on a view
OWith read only, on a view
HHash expression
FConstraint that involves a REF column
SSupplemental logging
对于H、S类型,尚不清楚情况,而且从上面我在11g数据库实验结果看,也没发现这两种类型。(有了解的朋友可以告知一二)
约束命名规范
约束名称建议自己定义一套命名规则,否则使用系统生成的约束名,很难能把它和对应的表、字段联系起来。
非空约束 NN_表名_列名
唯一约束 UK_表名_列名
主键约束 PK_表名
外键约束 FK_表名_列名
条件约束 CK_表名_列名
默认约束 DF_表名_列名
如果约束名称超过32位长度,建议应该缩写表名,而不应用NN_表名_数字。不过具体视情况而定,很多时候 DF_表名_列名 这样命名,往往超出了32字符。所以有时候需要缩写表面或是采用其它规则。
约束操作
约束管理
创建各类约束
先看一下如何创建主键约束
复制代码
CREATE TABLE "DM"."DEPT"
(
"DEPTNO" NUMBER(2,0) PRIMARY KEY,
"DNAME" VARCHAR2(14),
"LOC" VARCHAR2(13)
) TABLESPACE "TBS_DM_DAT" ;
COMMENT ON TABLE "DM"."DEPT" IS '部门表';
COMMENT ON COLUMN "DM"."DEPT"."DEPTNO" IS '部门编号';
COMMENT ON COLUMN "DM"."DEPT"."DNAME" IS '部门名称';
COMMENT ON CLOUMN "DM"."DEPT"."LOC" IS '部门所在地方';
复制代码
此时它的约束名称是系统创建的。如图所示:
如果我们以下面的脚本创建,此时约束如下所示
复制代码
1 CREATE TABLE "DM"."DEPT"
2 (
3 "DEPTNO" NUMBER(2,0),
4 "DNAME" VARCHAR2(14) ,
5 "LOC" VARCHAR2(13) ,
6 CONSTRAINT "PK_DEPT" PRIMARY KEY ("DEPTNO") USING INDEX TABLESPACE TBS_DM_IN
7 ) TABLESPACE "TBS_DM_DAT" ;
8
9
10
11
12 COMMENT ON TABLE "DM"."DEPT" IS '部门表';
13
14 COMMENT ON COLUMN "DM"."DEPT"."DEPTNO" IS '部门编号';
15
16 COMMENT ON COLUMN "DM"."DEPT"."DNAME" IS '部门名称';
17
18 COMMENT ON CLOUMN "DM"."DEPT"."LOC" IS '部门所在地方';
19
复制代码
如果一个表的约束类型比较多,你会看到一堆SYS_CN这样的约束,如果不仔细核对后面的字段,很难一眼看出约束类型、约束对应字段。
主键约束的限制
文档原文如下: (翻译在下)
Restrictions on Primary Key Constraints Primary constraints are subject to the following restrictions:
A table or view can have only one primary key.
一个表或视图有且只有一个主键
None of the columns in the primary key can be LOB, LONG, LONG RAW, VARRAY, NESTED TABLE, BFILE, REF, TIMESTAMP WITH TIME ZONE, or user-defined type. However, the primary key can contain a column of TIMESTAMP WITH LOCAL TIME ZONE.
主键字段不能为LOB、LOG、LOG RAW、VARRAY、NESTED TABLE、BFILE、REF、TIMESTAMP WITH TIME ZONE或用户定义类型。然而它可以包含TIMESTAMP WITH LOCAL TIME ZONE类型的字段。
The size of the primary key cannot exceed approximately one database block.
主键大小不能超过一个数据块大小。
A composite primary key cannot have more than 32 columns.
主键组合键不能超过32列。
You cannot designate the same column or combination of columns as both a primary key and a unique key.
你不能指定一列或组合列既是主键又是唯一键。
You cannot specify a primary key when creating a subview in an inheritance hierarchy. The primary key can be specified only for the top-level (root) view.
创建一个继承层次结构中的子视图时,你不能指定一个主键。主键可以唯一指定的顶层(根)视图。
外键约束
ALTER TABLE childTable
ADD CONSTRAINT FK_xxxx_xxx
FOREIGH KEY(columnName)
REFERENCES parentTalbe(primaryKeyColumn) [ON DELETE CASCADE|SET NULL];
ON DELETE SET NULL子句:当主表中的一行数据被删除时,Oracle系统会自动地将所有从表中依赖于它的数据记录的外键改成空值;
ON DELETE CASCADE:当主表中的一行数据被删除时,Oracle系统会自动地将所有从表中依赖于它的数据记录删除;
注:如果在外键定义中使用了ON DELETE SET NULL 或ON DELETE CASCADE,无论删除操作是在父表这一端还是子表这一端都不会产生违反引用完整性的问题,但是却留下了安全隐患。这两个子句要谨慎使用,只有在不得已时使用,谨记谨记!!!
外键约束对DML与DDL的影响:
INSERT:只有操作是在子表或从表这一端时才会产生违反引用完整性约束的问题,父表则不然。
DELETE:只有操作是在父表或主表这一端时才会产生违反引用完整性约束的问题,子表则不然。
UPDATE:子表父表直接操作都会违反引用完整性约束。两种解决方法:
1)先更新子表的引用列为空,再更新父表的主键的列的值,然后把子表的引用列更新成新的父表的值;
2)使用ON DELETE SET NULL,先更新父表,然后将子表外键为空的记录更新为新的值。
DDL语句:DROP TABLE与TRUNCATE TABLE,操作父表,违反引用完整性约束,子表则不然。
外键约束的限制:
Restrictions on Foreign Key Constraints Foreign key constraints are subject to the following restrictions:
None of the columns in the foreign key can be of LOB, LONG, LONG RAW, VARRAY, NESTED TABLE, BFILE, REF, TIMESTAMP WITH TIME ZONE, or user-defined type. However, the primary key can contain a column of TIMESTAMP WITH LOCAL TIME ZONE.
外键字段不能为LOB, LONG, LONG RAW, VARRAY, NESTED TABLE, BFILE, REF, TIMESTAMP WITH TIME ZONE, or user-defined type类型,主键可以包含数据类型为TIMESTAMP WITH LOCAL TIME ZONE的字段。
The referenced unique or primary key constraint on the parent table or view must already be defined.
引用唯一或主键约束,必须是父表中已经定义的。
A composite foreign key cannot have more than 32 columns.
外键的组合列不能超过32列。
The child and parent tables must be on the same database. To enable referential integrity constraints across nodes of a distributed database, you must use database triggers. See CREATE TRIGGER.
字表和父表必须在同一个数据库。分布式数据库中,外键不能跨节点,但触发器可以
If either the child or parent object is a view, then the constraint is subject to all restrictions on view constraints. See "View Constraints".
You cannot define a foreign key constraint in a CREATE TABLE statement that contains an AS subquery clause. Instead, you must create the table without the constraint and then add it later with an ALTER TABLE statement.
你不能在CREATE TABLE语句中包含AS子查询子句定义一个外键约束。相反,你必须创建一个没有约束的表,然后添加ALTER TABLE语句。
加上一些类似其它约束的限制.
条件约束
非空约束
非空约束的限制:
1: 你不能在视图约束上指定字段为NULL或NOT NULL值
2: 你不能指定一个对象的属性为NULL或NOT NULL。相反,而应使用的IS [NOT] NULL条件CHECK约束
条件约束中的条件与查询语句中的条件相同,但是不能包括以下内容:
1)CURRVAL,NETXTVAL,LEVEL和ROWNUM这样的伪列(PSEUDOCOLUMNS);
2)引用其它行中值的查询语句;
3)SYSDATE,USER,USERENV和UID的函数调用。
文档原文如下:
Restrictions on NOT NULL Constraints NOT NULL constraints are subject to the following restrictions:
You cannot specify NULL or NOT NULL in a view constraint.
You cannot specify NULL or NOT NULL for an attribute of an object. Instead, use a CHECK constraint with the IS [NOT] NULL condition.
唯一约束
唯一约束的限制:
文档原文如下:
Restrictions on Unique Constraints Unique constraints are subject to the following restrictions:
None of the columns in the unique key can be of LOB, LONG, LONG RAW, VARRAY, NESTED TABLE, OBJECT, REF, TIMESTAMP WITH TIME ZONE, or user-defined type. However, the unique key can contain a column of TIMESTAMP WITH LOCAL TIME ZONE.
当字段类型为LOB、LOG、LONG RAW、 VARRAY、NESTED TABLE、OBJECT、REF、TIMESTAMP、用户定义类型时,不能在字段上定义唯一性约束。当数据类型为TIMESTAMP WITH LOCAL TIME ZONE
A composite unique key cannot have more than 32 columns.
组合字段定义的唯一索引,字段个数不能超过32个
You cannot designate the same column or combination of columns as both a primary key and a unique key.
你不能指定同一字段或组合字段即为主键又是唯一键
You cannot specify a unique key when creating a subview in an inheritance hierarchy. The unique key can be specified only for the top-level (root) view.
约束管理
删除约束
复制代码
ALTER TABLE DM.EMP
DROP CONSTRAINT SYS_C00115525;
CASCADE子句用来删除存在有完整性关系的约束。当然你也可以用如下语法
ALTER TABLE DM.EMP
DROP UNIQUE (COMM);
复制代码
添加约束
复制代码
添加非空约束
ALTER TABLE DM.EMP
MODIFY(MGR CONSTRAINT CK_EMP_MGR NOT NULL);
添加其他约束
ALTER TABLE DM.EMP
ADD CONSTRAINT CK_EMP_SAL CHECK(SAL 0 AND SAL 20000);
复制代码
重命名约束
ALTER TABLE METAONE.T1
RENAME CONSTRAINT SYS_C0059699 TO PK_T1
约束维护
禁用约束
ALTER TABLE 表 DISABLE CONSTRAINT 约束名 [CASCADE];
ALTER TABLE DM.EMP
DISABLE CONSTRAINT UK_EMP_COMM;
ALTER TABLE TEST DISABLE PRIMARY KEY CASCADE;
参数CASCADE子句用来关闭存在有完整性关系的约束,比如DISABLE一个主键,如果没有CASCADE子句就会出错,此时使用CASCADE子句DISABLE主键可以将该主键与相关外键一起DISABLE掉。使用的情况:例如在数据库系统中大规模装入数据时,为了系统的效率您不得不牺牲数据的一致性来关闭一些约束,甚至删除一些约束将主表主键禁止的同时,也将禁止依赖于此主键的外键禁止了.
使用上面脚本禁用约束的时候会删除索引,如果你想禁用约束的时候,保留索引,可以使用如下脚本(当然你再启用约束的时候会重新重建索引,这对大表显然开销相当大)
ALTER TABLE DM.EMP
DISABLE CONSTRAINT UK_EMP_COMM KEEP INDEX;
启用约束
如果关闭主键约束时使用了CASCADE,此时使用ENABLE不会将主键约束与外键约束同时打开,只能对主键约束与外键约束分别使用ENABLE CONSTRAINT 子句打开。
推迟约束
Deferring Constraint Checks
当前事务的Constraint Checks全部推迟
SET CONSTRAINTS ALL DEFERRED;
SET CONSTRAINT XXX DEFERRED;
当前会话的Constraint Checks.
ALTER SSSSION SET CONSTRAINTS ALL deferred;
ALTER SSSSION SET CONSTRAINT xxx deferred;
约束信息
复制代码
SELECT * FROM DBA_CONSTRAINTS;
SELECT * FROM ALL_CONSTRAINTS;
SELECT * FROM USER_CONSTRAINTS;
SELECT * FROM DBA_CONS_COLUMNS;
SELECT * FROM ALL_CONS_COLUMNS;
SELECT * FROM USER_CONS_COLUMNS;
复制代码
约束有四种状态:ENABLE、VALID、INVALID、DISABLE
约束的检查机制
IMMEDIATE语句级:Oracle performs its constraint checking after the statement has been completely executed.
DEFERRED(事务级):A constraint is deferred if the system checks that it is satisfied only on commit. If a deferred constraint is violated, then commit causes the transaction to rollback;(推迟到事务提交时才检查约束,谨慎使用)
约束用于限制加入表数据的类型,目的是保证数据的一致性和完整性
创建格式:在创建表时规定约束(在Create添加),也可以在创建之后添加(Alter table)。
约束类型:NOT NULL、UNIQUE、PRIMARY KEY、FOREIGN KEY、CHECK、DEFAULT。
非空约束就是限制必须为某个列提供值,不允许有空值的存在。
空值(NULL)是不存在的值,它既不是数字0也不是空字符串,而是不存在未知的情况,即:该列的所有值不能为空,但可以为空字符或者0。
结果:通过desc查看会发现Nullable那一列的Y消失,表示此列不能为空。且在插入数值的时候此列必须添加数值,否则会报错。
取消非空约束使用alter方法:alter table test1 modify Author null; 设置test1的Author可以
唯一性约束强调所在的列不允许有相同的值,但可以有多个Null。
其定义比主键约束弱,即他的列允许有空值(主键不允许有空值),唯一性约束的主要作用是保证在除主键外,其他列值得唯一性。
即:直接在列后面添加unique,
或在列后面添加 constraint 约束名 unique,
或在最后添加constraint 约束 unique(列名),
或者alter table 表名 add constraint 约束名 unique(列名);
建议使用的方法为alter和在最后添加最后添加constraint 约束 unique(列名)。
注:添加约束名的好处为:便于删除操作,在删除时需要通过约束名来完成操作。同时如果不添加约束名则系统会自动生成约束名,在表移动等操作时,约束名也会更改,会造成后期操作的麻烦。
取消唯一性约束:alter table test3 drop constraint QQ_UK2;
主键约束唯一地标识了每一行记录(非空+唯一),在一个表中,最多只能有一个主键约束,主键约束既可以由一个列组成,也可以由两个或两个以上列组成(这种称联合主键)。
具体的方法和添加唯一约束相同,建议使用的方法为alter和在最后添加最后添加constraint 约束 unique(列名)。
删除主键:alter table 表名 drop constraint 约束名
外键约束主要是在B表中的某一列受到A表的制约,B的那一列的值只能是A内的值,比如工资表的员工号必须受员工表的员工号限制一样,工资表不能有不存在的员工号。
一般外键约束会使用两个表进行关联,外键是指"当前表"引用"另一个表"的某一列或某几列。在另一个表中,被引用的列必须具有主键约束或者唯一性约束,不存在的数据不能出现在当前表的对应列中。一般情况下当删除被引用表中数据时,该数据也不能出现在外键列中,如果存在则删除失败。
删除外键约束:alter table test5_1 drop constraint FK_test_5_1;
check约束是为了让表中某字段值只能输入固定的值。
check设置数值范围:constraint check 表名 check (列名 between 小范围 and 大范围);
设置为大写:constraint check 表名 check (列名 = upper(列名));
取消 alter table test6_2 drop constraint check_test_6_2;
默认约束是设置列的默认值,即当插入一行时,若不给出该列的值,就用默认值代替。
结果:在添加数据的时候,如果在设置有默认值的列没有添加数据则会把默认值添加进去。
取消默认约束 alter table test2 modify BOOKNAME default null;
注:
add用于修改字段类型和长度的(即修改字段的属性)
modify修改表的数据结构。
update是修改数据内容的。
drop是删除数据内容。
你那条语句有问题,正确的写法是
create
table
students(student_id
NUMBER(5)
,CONSTRAINT
student_pk
PRIMAPY
KEY(student_id));
翻译成中文是:
create
table
表名(列名
NUMBER(5)
,CONSTRAINT 约束名
PRIMAPY
KEY(列名));
意思是创建了个students表.你面就有一列.并且这列设置成了主键.
后面那个CONSTRAINT
student_pk
PRIMAPY
KEY(列名)
就是将这列设置成了主键!
他是对此列的一个约束.并且我们为这个约束创建了个名字叫student_pk
primary
key(列名)
这是一个主键约束.指明了这一列是主键.
应该是 "间接" 的自动对B表也起作用。
比如 你这个 A 表的 字段 叫 Keyword, 约束是 = 1000。
那么你要是往 A 表 插入/修改数据的时候, 小于 1000 的,是没办法插入数据库的。
然后,你这个 Keyword , 又是 B表的 外键。 比如字段名叫 AKeyword
虽然这个 B表的 AKeyword 字段, 没有 = 1000 的约束。
但是由于 是个外键。
也就是 当你 尝试 插入/更新 这个 AKeyword 字段 的时候
会去 A 表确认有没有匹配的数据。
假如尝试 INSERT INTO B (AKeyword) VALUES(10)
那么 将报外键错误。
"间接" 的自动对B表也起作用。