新聞中心
Oracle數(shù)據(jù)庫是一種使用廣泛的關系型數(shù)據(jù)庫管理系統(tǒng),是許多企業(yè)和機構(gòu)標準化的數(shù)據(jù)庫平臺。Oracle數(shù)據(jù)庫的關鍵組成部分就是約束條件,這種用于強制實施數(shù)據(jù)完整性的規(guī)則是數(shù)據(jù)庫中的一個重要概念。但是,隨著業(yè)務需求的變化,我們有可能需要修改現(xiàn)有的約束條件,以滿足新的數(shù)據(jù)要求。那么,到底如何修改Oracle數(shù)據(jù)庫中的約束條件呢?下面將詳細介紹這個過程。

成都創(chuàng)新互聯(lián)公司-專業(yè)網(wǎng)站定制、快速模板網(wǎng)站建設、高性價比滎經(jīng)網(wǎng)站開發(fā)、企業(yè)建站全套包干低至880元,成熟完善的模板庫,直接使用。一站式滎經(jīng)網(wǎng)站制作公司更省心,省錢,快速模板網(wǎng)站建設找我們,業(yè)務覆蓋滎經(jīng)地區(qū)。費用合理售后完善,10多年實體公司更值得信賴。
之一步:找到要修改的約束條件
要修改Oracle數(shù)據(jù)庫中的某個表的約束條件,首先需要確定該表的名稱以及要修改的約束條件的名稱。使用如下SQL查詢語句可以查找到表名稱、列名、約束名稱以及約束類型:
“`sql
select table_name, column_name, constrnt_name, constrnt_type
from user_cons_columns
where table_name=’MY_TABLE’;
“`
我們需要將查詢語句中的MY_TABLE替換成需要修改的表名稱。查詢結(jié)果會返回該表中所有的約束條件信息。
第二步:修改約束條件
在修改約束條件之前,我們需要先確定需要作出的變更。例如,我們想要取消某個列的唯一性約束,這時我們需要使用如下SQL語句:
“`sql
alter table MY_TABLE
drop constrnt MY_CONSTRNT;
“`
如果我們要修改某個約束條件,例如將某個列的唯一性約束修改為非唯一性,可以使用如下SQL語句:
“`sql
alter table MY_TABLE
modify MY_COLUMN null;
“`
如果要修改約束條件的名稱,我們可以使用如下SQL語句:
“`sql
alter table MY_TABLE
rename constrnt MY_OLD_CONSTRNT to MY_NEW_CONSTRNT;
“`
需要注意的是,修改約束條件可能會影響到已經(jīng)存在的數(shù)據(jù),因此應該謹慎操作,并在修改之前進行備份和測試。
第三步:驗證修改后的約束條件
在完成修改后,我們需要驗證修改是否生效??梢允褂萌缦耂QL查詢語句來檢查:
“`sql
select CONSTRNT_NAME, CONSTRNT_TYPE, COLUMN_NAME
from user_cons_columns
where table_name=’MY_TABLE’;
“`
該查詢語句返回的結(jié)果應該是修改后的約束條件。另外,也可以使用INSERT語句來測試修改后的約束條件。
在Oracle數(shù)據(jù)庫中,約束條件是強制實施數(shù)據(jù)完整性的關鍵組成部分。為了滿足業(yè)務需求,我們有可能需要修改現(xiàn)有的約束條件。通過上述步驟,我們可以快速修改表中的約束條件。需要注意的是,約束條件的修改可能會影響到已有的數(shù)據(jù),應該謹慎操作并進行備份和測試。
相關問題拓展閱讀:
- 在 oracle11g系統(tǒng)中 約束的類型有哪些
在 oracle11g系統(tǒng)中 約束的類型有哪些
你可以導成pdm文件然后再導入到本機的.
ORACLE約束總結(jié)
你對ORACLE約束的了解如何?比較模糊還是相當透徹?如果你對下面幾個問題了如指掌的話,恭喜你,你已經(jīng)對約束掌握得比較好了,不用看這篇文章了。ORACLE的約束有啥功能作用? 有哪些類型約束(不同版本ORACLE是否不同)?視圖有約束嗎?約束是否會影響SQL性能? 約束信息存儲在哪些系統(tǒng)視圖、數(shù)據(jù)字典中?約束能否修改名稱?能否禁用約束?延遲約束有啥好處…….
約束定義
約束是強加在表上的規(guī)則或條件。確保數(shù)據(jù)庫滿足業(yè)務規(guī)則。保證數(shù)據(jù)的完整性。當對表進行DML或DDL操作時,如果此操作會造成表中的數(shù)據(jù)違反約束條件或規(guī)則的話,系統(tǒng)就會拒絕執(zhí)行這個操作。約束可以是列一級別的 也可以是表級別的。定義約束時沒有給出約束的名字,ORACE系統(tǒng)將為該約束自動生成一個名字,其格式為SYS_Cn,其中n為自然數(shù)(強烈建議各位在創(chuàng)建表或增加約束時,給約束定義名稱。).
約束功能
約束的功能:實現(xiàn)一些業(yè)務規(guī)則,防止無效的垃圾數(shù)據(jù)進入數(shù)據(jù)庫,維護數(shù)據(jù)庫的完整性(完整性指正確性與一致性)。從而使數(shù)據(jù)庫的開發(fā)和維護都更加容易。
約束分類
約束分為6類: 非空(NOT NULL)約束、 唯一(UNIQUE)約束、主鍵(PRIMARY KEY)約束、外鍵(FOREIGN KEY)約束、條件(CHECK)約束、REF約束。
非空(NOT NULL)約束:顧名思義,所約束的列不能為NULL值。否則就會報錯
唯一(UNIQUE)約束:在表中每一行中所定義的這列或這些列的值都不能相同。必須保證唯一性。否則就會違法約束條件。
主鍵(PRIMARY KEY)約束:唯一的標識表中的每一行,不能重復,不能為空。 創(chuàng)建主鍵或唯一約束后,ORACLE會自動創(chuàng)建一個與約束同名的索引(UNIQUENES為UNIQUE唯一索引)。需要注意的是:每個表只能有且有一個主鍵約束。
外鍵(FOREIGN KEY)約束:用來維護從表(Child Table)和主表(Parent Table)之間的引用完整性. 外鍵約束是個有爭議性的約束,它一方面能夠維護數(shù)據(jù)庫的數(shù)據(jù)一致性,數(shù)據(jù)的完整性。防止錯誤的垃圾數(shù)據(jù)入庫; 另外一方面它會增加表插入、更新等SQL性能的額外開銷,不少系統(tǒng)里面通過業(yè)務邏輯控制來取消外鍵約束。例如在數(shù)據(jù)倉庫中,就推薦禁用外鍵約束。
條件(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 數(shù)據(jù)庫的約束類型如下:
ORACLE 10 數(shù)據(jù)庫的約束類型如下:
在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)
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
H Hash expression
F Constraint that involves a REF column
S Supplemental logging
對于H、S類型,尚不清楚情況,而且從上面我在11g數(shù)據(jù)庫實驗結(jié)果看,也沒發(fā)現(xiàn)這兩種類型。(有了解的朋友可以告知一二)
約束命名規(guī)范
約束名稱建議自己定義一套命名規(guī)則,否則使用系統(tǒng)生成的約束名,很難能把它和對應的表、字段聯(lián)系起來。
非空約束 NN_表名_列名
唯一約束 UK_表名_列名
主鍵約束 PK_表名
外鍵約束 FK_表名_列名
條件約束 CK_表名_列名
默認約束 DF_表名_列名
如果約束名稱超過32位長度,建議應該縮寫表名,而不應用NN_表名_數(shù)字。不過具體視情況而定,很多時候 DF_表名_列名 這樣命名,往往超出了32字符。所以有時候需要縮寫表面或是采用其它規(guī)則。
約束操作
約束管理
創(chuàng)建各類約束
先看一下如何創(chuàng)建主鍵約束
復制代碼
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 ‘部門所在地方’;
復制代碼
此時它的約束名稱是系統(tǒng)創(chuàng)建的。如圖所示:
如果我們以下面的腳本創(chuàng)建,此時約束如下所示
復制代碼
1 CREATE TABLE “DM”.”DEPT”
2 (
“DEPTNO”NUMBER(2,0) ,
“DNAME”VARCHAR2(14) ,
“LOC”VARCHAR2(13) ,
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.
主鍵大小不能超過一個數(shù)據(jù)塊大小。
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.
創(chuàng)建一個繼承層次結(jié)構(gòu)中的子視圖時,你不能指定一個主鍵。主鍵可以唯一指定的頂層(根)視圖。
外鍵約束
ALTER TABLE childTable
ADD CONSTRAINT FK_xxxx_xxx
FOREIGH KEY(columnName)
REFERENCES parentTalbe(primaryKeyColumn) ;
ON DELETE SET NULL子句:當主表中的一行數(shù)據(jù)被刪除時,Oracle系統(tǒng)會自動地將所有從表中依賴于它的數(shù)據(jù)記錄的外鍵改成空值;
ON DELETE CASCADE:當主表中的一行數(shù)據(jù)被刪除時,Oracle系統(tǒng)會自動地將所有從表中依賴于它的數(shù)據(jù)記錄刪除;
注:如果在外鍵定義中使用了ON DELETE SET NULL 或ON DELETE CASCADE,無論刪除操作是在父表這一端還是子表這一端都不會產(chǎn)生違反引用完整性的問題,但是卻留下了安全隱患。這兩個子句要謹慎使用,只有在不得已時使用,謹記謹記?。?!
外鍵約束對DML與DDL的影響:
INSERT:只有操作是在子表或從表這一端時才會產(chǎn)生違反引用完整性約束的問題,父表則不然。
DELETE:只有操作是在父表或主表這一端時才會產(chǎn)生違反引用完整性約束的問題,子表則不然。
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類型,主鍵可以包含數(shù)據(jù)類型為TIMESTAMP WITH LOCAL TIME ZONE的字段。
The referenced unique or primary key constraint on the parent table or view must already be defined.
引用唯一或主鍵約束,必須是父表中已經(jīng)定義的。
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.
字表和父表必須在同一個數(shù)據(jù)庫。分布式數(shù)據(jù)庫中,外鍵不能跨節(jié)點,但觸發(fā)器可以
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子查詢子句定義一個外鍵約束。相反,你必須創(chuàng)建一個沒有約束的表,然后添加ALTER TABLE語句。
加上一些類似其它約束的限制.
條件約束
非空約束
非空約束的限制:
1: 你不能在視圖約束上指定字段為NULL或NOT NULL值
2: 你不能指定一個對象的屬性為NULL或NOT NULL。相反,而應使用的IS NULL條件CHECK約束
條件約束中的條件與查詢語句中的條件相同,但是不能包括以下內(nèi)容:
1)CURRVAL,NETXTVAL,LEVEL和ROWNUM這樣的偽列(PSEUDOCOLUMNS);
2)引用其它行中值的查詢語句;
3)SYSDATE,USER,USERENV和UID的函數(shù)調(diào)用。
文檔原文如下:
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 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、用戶定義類型時,不能在字段上定義唯一性約束。當數(shù)據(jù)類型為TIMESTAMP WITH LOCAL TIME ZONE
A composite unique key cannot have more than 32 columns.
組合字段定義的唯一索引,字段個數(shù)不能超過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_C;
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
復制代碼
重命名約束
ALTER TABLE METAONE.T1
RENAME CONSTRAINT SYS_CTO PK_T1
約束維護
禁用約束
ALTER TABLE 表 DISABLE CONSTRAINT 約束名 ;
ALTER TABLE DM.EMP
DISABLE CONSTRAINT UK_EMP_COMM;
ALTER TABLE TEST DISABLE PRIMARY KEY CASCADE;
參數(shù)CASCADE子句用來關閉存在有完整性關系的約束,比如DISABLE一個主鍵,如果沒有CASCADE子句就會出錯,此時使用CASCADE子句DISABLE主鍵可以將該主鍵與相關外鍵一起DISABLE掉。使用的情況:例如在數(shù)據(jù)庫系統(tǒng)中大規(guī)模裝入數(shù)據(jù)時,為了系統(tǒng)的效率您不得不犧牲數(shù)據(jù)的一致性來關閉一些約束,甚至刪除一些約束將主表主鍵禁止的同時,也將禁止依賴于此主鍵的外鍵禁止了.
使用上面腳本禁用約束的時候會刪除索引,如果你想禁用約束的時候,保留索引,可以使用如下腳本(當然你再啟用約束的時候會重新重建索引,這對大表顯然開銷相當大)
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;
復制代碼
約束有四種狀態(tài):ENABLE、VALID、INVALID、DISABLE
約束的檢查機制
IMMEDIATE語句級:Oracle performs its constraint checking after the statement has been completely executed.
關于oracle數(shù)據(jù)庫修改約束條件的介紹到此就結(jié)束了,不知道你從中找到你需要的信息了嗎 ?如果你還想了解更多這方面的信息,記得收藏關注本站。
創(chuàng)新互聯(lián)成都網(wǎng)站建設公司提供專業(yè)的建站服務,為您量身定制,歡迎來電(028-86922220)為您打造專屬于企業(yè)本身的網(wǎng)絡品牌形象。
成都創(chuàng)新互聯(lián)品牌官網(wǎng)提供專業(yè)的網(wǎng)站建設、設計、制作等服務,是一家以網(wǎng)站建設為主要業(yè)務的公司,在網(wǎng)站建設、設計和制作領域具有豐富的經(jīng)驗。
新聞名稱:如何修改Oracle數(shù)據(jù)庫中的約束條件?(oracle數(shù)據(jù)庫修改約束條件)
標題來源:http://www.fisionsoft.com.cn/article/djgpcod.html


咨詢
建站咨詢
