新聞中心
oracle的主鍵和索引的關(guān)系是什么?
在oracle中,我們創(chuàng)建一個(gè)主鍵,則同時(shí)自動(dòng)創(chuàng)建了一個(gè)同名的唯一索引;刪除主鍵,則主鍵約束和對(duì)應(yīng)的唯一索引都刪除了。這是我們經(jīng)常見到的現(xiàn)象。\x0d\x0a \x0d\x0a發(fā)出一個(gè)創(chuàng)建主鍵的sql,oracle其實(shí)執(zhí)行了兩步:創(chuàng)建主鍵約束、創(chuàng)建/關(guān)聯(lián) 唯一索引。步驟是這樣的:\x0d\x0a創(chuàng)建主鍵約束時(shí),檢查該主鍵字段上是否已經(jīng)存在唯一索引。若不存在,則自動(dòng)創(chuàng)建同名唯一索引;若存在,則直接創(chuàng)建主鍵約束,并將該約束和已經(jīng)存在的唯一索引對(duì)應(yīng)上。 \x0d\x0a刪除主鍵約束時(shí),可以決定是否保留對(duì)應(yīng)的索引;刪除唯一索引時(shí),若存在對(duì)應(yīng)的主鍵約束,則不能刪除。\x0d\x0a \x0d\x0a總之,存在主鍵約束,則肯定存在與之對(duì)應(yīng)的唯一索引,而存在唯一索引,不一定對(duì)應(yīng)著有主鍵約束。\x0d\x0a \x0d\x0a下面我們驗(yàn)證一下:\x0d\x0a \x0d\x0aSQL create table test_pri(a number(1), b number(1));\x0d\x0a \x0d\x0a表已創(chuàng)建。\x0d\x0a \x0d\x0a--1.創(chuàng)建主鍵,則自動(dòng)創(chuàng)建同名唯一索引\x0d\x0a--1.1創(chuàng)建主鍵,主鍵約束和唯一索引同時(shí)創(chuàng)建\x0d\x0aSQL alter table test_pri add constraint pk_test_pri_a primary key(a);\x0d\x0a \x0d\x0a表已更改。\x0d\x0a\x0d\x0aSQL select CONSTRAINT_NAME, TABLE_NAME, INDEX_NAME\x0d\x0a 2 from user_constraints where table_name = 'TEST_PRI';\x0d\x0a \x0d\x0aCONSTRAINT_NAME TABLE_NAME INDEX_NAME \x0d\x0a----------------- ------------ -------------\x0d\x0aPK_TEST_PRI_A TEST_PRI PK_TEST_PRI_A\x0d\x0a \x0d\x0aSQL select INDEX_NAME, INDEX_TYPE, TABLE_NAME, UNIQUENESS\x0d\x0a 2 from user_indexes where table_name = 'TEST_PRI';\x0d\x0a \x0d\x0aINDEX_NAME INDEX_TYPE TABLE_NAME UNIQUENES\x0d\x0a---------------- ------------ ------------ ---------\x0d\x0aPK_TEST_PRI_A NORMAL TEST_PRI UNIQUE\x0d\x0a \x0d\x0a--1.2 刪除主鍵,主鍵約束和對(duì)應(yīng)的唯一索引都刪除了\x0d\x0aSQL alter table test_pri drop constraint pk_test_pri_a;\x0d\x0a \x0d\x0a表已更改。\x0d\x0a \x0d\x0aSQL select CONSTRAINT_NAME, TABLE_NAME, INDEX_NAME\x0d\x0a 2 from user_constraints where table_name = 'TEST_PRI';\x0d\x0a \x0d\x0a未選定行\(zhòng)x0d\x0a \x0d\x0aSQL select INDEX_NAME, INDEX_TYPE, TABLE_NAME, UNIQUENESS\x0d\x0a 2 from user_indexes where table_name = 'TEST_PRI';\x0d\x0a \x0d\x0a未選定行\(zhòng)x0d\x0a \x0d\x0a--1.3其實(shí)刪除主鍵時(shí)可以選擇保留索引的\x0d\x0aSQL alter table test_pri add constraint pk_test_pri_a primary key(a);\x0d\x0a \x0d\x0a表已更改。\x0d\x0a \x0d\x0aSQL alter table test_pri drop constraint pk_test_pri_a keep index;\x0d\x0a \x0d\x0a表已更改。\x0d\x0a \x0d\x0aSQL select CONSTRAINT_NAME, TABLE_NAME, INDEX_NAME\x0d\x0a 2 from user_constraints where table_name = 'TEST_PRI';\x0d\x0a \x0d\x0a未選定行\(zhòng)x0d\x0a \x0d\x0aSQL select INDEX_NAME, INDEX_TYPE, TABLE_NAME, UNIQUENESS\x0d\x0a 2 from user_indexes where table_name = 'TEST_PRI';\x0d\x0a \x0d\x0aINDEX_NAME INDEX_TYPE TABLE_NAME UNIQUENES\x0d\x0a--------------- ----------- ----------- ---------\x0d\x0aPK_TEST_PRI_A NORMAL TEST_PRI UNIQUE\x0d\x0a\x0d\x0a--2.在存在唯一索引的列上創(chuàng)建主鍵,則只創(chuàng)建主鍵約束,同時(shí)將該約束與已有唯一索引關(guān)聯(lián)上(名稱可以不一致)\x0d\x0aSQL drop index pk_test_pri_a;\x0d\x0a \x0d\x0a索引已丟棄。\x0d\x0a \x0d\x0a--2.1 先創(chuàng)建唯一索引,再創(chuàng)建主鍵,名稱可以不一致\x0d\x0aSQL create unique index pk_test_pri_a on test_pri(a);\x0d\x0a \x0d\x0a索引已創(chuàng)建。\x0d\x0a \x0d\x0aSQL alter table test_pri add constraint pk_test_pri primary key(a);\x0d\x0a \x0d\x0a表已更改。\x0d\x0a \x0d\x0aSQL select INDEX_NAME, INDEX_TYPE, TABLE_NAME, UNIQUENESS\x0d\x0a 2 from user_indexes where table_name = 'TEST_PRI';\x0d\x0a \x0d\x0aINDEX_NAME INDEX_TYPE TABLE_NAME UNIQUENES\x0d\x0a--------------- ----------- ------------ ---------\x0d\x0aPK_TEST_PRI_A NORMAL TEST_PRI UNIQUE\x0d\x0a \x0d\x0aSQL select CONSTRAINT_NAME, TABLE_NAME, INDEX_NAME\x0d\x0a 2 from user_constraints where table_name = 'TEST_PRI';\x0d\x0a \x0d\x0aCONSTRAINT_NAME TABLE_NAME INDEX_NAME\x0d\x0a------------------ ------------ -------------\x0d\x0aPK_TEST_PRI TEST_PRI PK_TEST_PRI_A\x0d\x0a \x0d\x0a--2.2 不可刪除存在主鍵約束的唯一索引\x0d\x0aSQL drop index PK_TEST_PRI_A;\x0d\x0adrop index PK_TEST_PRI_A\x0d\x0a *\x0d\x0aERROR 位于第 1 行:\x0d\x0aORA-02429: 無法刪除用于強(qiáng)制唯一/主鍵的索引\x0d\x0a \x0d\x0a--2.3雖然兩者名稱不一致,但也是關(guān)聯(lián)在一塊的:刪除約束,則對(duì)應(yīng)的索引同時(shí)刪除\x0d\x0aSQL alter table test_pri drop constraint pk_test_pri; \x0d\x0a \x0d\x0a表已更改。\x0d\x0a \x0d\x0aSQL select INDEX_NAME, INDEX_TYPE, TABLE_NAME, UNIQUENESS\x0d\x0a 2 from user_indexes where table_name = 'TEST_PRI';\x0d\x0a \x0d\x0a未選定行\(zhòng)x0d\x0a \x0d\x0aSQL select CONSTRAINT_NAME, TABLE_NAME, INDEX_NAME\x0d\x0a 2 from user_constraints where table_name = 'TEST_PRI';\x0d\x0a \x0d\x0a未選定行\(zhòng)x0d\x0a \x0d\x0aSQL
成都創(chuàng)新互聯(lián)公司是一家業(yè)務(wù)范圍包括IDC托管業(yè)務(wù),網(wǎng)站空間、主機(jī)租用、主機(jī)托管,四川、重慶、廣東電信服務(wù)器租用,德陽機(jī)房服務(wù)器托管,成都網(wǎng)通服務(wù)器托管,成都服務(wù)器租用,業(yè)務(wù)范圍遍及中國(guó)大陸、港澳臺(tái)以及歐美等多個(gè)國(guó)家及地區(qū)的互聯(lián)網(wǎng)數(shù)據(jù)服務(wù)公司。
ORACLE 更改主鍵怎么改?
1、首先應(yīng)該刪除已有的主鍵約束\x0d\x0a ①若已知道該主鍵命名\x0d\x0a\x0d\x0a alter table 表名 drop constraint 主鍵名;\x0d\x0a\x0d\x0a ②若不知道朱建命名\x0d\x0a\x0d\x0a SELECT * from user_cons_columns c where c.table_name = '表名';\x0d\x0a\x0d\x0a 找到主鍵字段column對(duì)應(yīng)的主鍵名,再執(zhí)行①\x0d\x0a\x0d\x0a2、增加新的主鍵約束\x0d\x0a alter table 表名 add constraint 主鍵名 primary key(字段名);
Oracle查看表索引、主鍵、外鍵、約束
查看表索引、主鍵、外鍵、約束
(包括索引名,類型,構(gòu)成列)
SELECT T.*, I.INDEX_TYPE
FROM USER_IND_COLUMNS T,USER_INDEXES I
WHERE T.INDEX_NAME = I.INDEX_NAME
AND T.TABLE_NAME = I.TABLE_NAME
AND T.TABLE_NAME = 'ORG_DLF' ----指定表
AND T.TABLE_OWNER= 'ODSRPT_SIT2'; ----指定用戶
(包括名稱,構(gòu)成列)
SELECT CU.*
FROM DBA_CONS_COLUMNS CU, DBA_CONSTRAINTS AU
WHERE CU.CONSTRAINT_NAME = AU.CONSTRAINT_NAME
AND AU.CONSTRAINT_TYPE = 'P'
AND AU.TABLE_NAME = 'LOAN_APPLICATION_FEE' -----指定表名
AND CU.OWNER='ODSRPT_SIT2'; -----指定用戶名
(包括表名稱,構(gòu)成列)
SELECT CU.COLUMN_NAME,AU.TABLE_NAME
FROM DBA_CONS_COLUMNS CU, DBA_CONSTRAINTS AU
WHERE CU.CONSTRAINT_NAME = AU.CONSTRAINT_NAME
AND AU.CONSTRAINT_TYPE = 'U'
AND AU.OWNER='RPT_UAT2' -----指定用戶名
AND AU.TABLE_NAME = 表名 ; -----指定表名
Select a.Owner 外鍵擁有者,
a.Table_Name 外鍵表,
c.Column_Name 外鍵列,
b.Owner 主鍵擁有者,
b.Table_Name 主鍵表,
d.Column_Name 主鍵列,
c.Constraint_Name 外鍵名,
d.Constraint_Name 主鍵名
From User_Constraints a,
user_Constraints b,
user_Cons_Columns c, --外鍵表
user_Cons_Columns d --主鍵表
Where a.r_Constraint_Name = b.Constraint_Name
And a.Constraint_Type = 'R'
And b.Constraint_Type = 'P'
And a.r_Owner = b.Owner
And a.Constraint_Name = c.Constraint_Name
And b.Constraint_Name = d.Constraint_Name
And a.Owner = c.Owner
And a.Table_Name = c.Table_Name
And b.Owner = d.Owner
And b.Table_Name = d.Table_Name;
Oracle如何添加主鍵約束
工具/材料
SQL Developer
01
首先打開SQL Developer軟件,找一個(gè)沒有主鍵約束的表,如下圖所示
02
然后我們新建一個(gè)查詢,在界面中輸入如下的約束修改語句,如下圖所示,主要通過add constranint來添加約束
03
編寫完約束添加語句以后,點(diǎn)擊工具欄中的執(zhí)行按鈕,如下圖所示,如果輸出欄顯示已變更則證明主鍵約束創(chuàng)建成果
04
然后我們進(jìn)入STUDENT表的約束添加頁中可以看到,我們加的主鍵約束已經(jīng)添加進(jìn)去了,如下圖所示
05
另外,創(chuàng)建表的時(shí)候可以直接添加主鍵約束,如下圖所示,直接在表創(chuàng)建語句中添加constraint即可
06
表創(chuàng)建完以后,記得在左側(cè)刷新數(shù)據(jù)庫信息,如下圖所示,因?yàn)槟銊?chuàng)建的信息不刷新的話不會(huì)更新
07
最后打開你所創(chuàng)建的表,看到你添加的主鍵約束已經(jīng)加入進(jìn)來了,這種方式的效果alter的方式是一樣的
oracle主鍵怎么插入
1、創(chuàng)建表的同時(shí)創(chuàng)建主鍵約束
(1)無命名
create
table
student
(
studentid
int
primary
key
not
null,
studentname
varchar(8),
age
int);
(2)有命名
create
table
students
(
studentid
int
,
studentname
varchar(8),
age
int,
constraint
yy
primary
key(studentid));
2、刪除表中已有的主鍵約束
(1)無命名
可用
SELECT
*
from
user_cons_columns;
查找表中主鍵名稱得student表中的主鍵名為SYS_C002715
alter
table
student
drop
constraint
SYS_C002715;
(2)有命名
alter
table
students
drop
constraint
yy;
3、向表中添加主鍵約束
alter
table
student
add
constraint
pk_student
primary
key(studentid);
網(wǎng)站標(biāo)題:oracle怎么主鍵約束,oracle主鍵約束導(dǎo)入導(dǎo)出
分享地址:http://www.dlmjj.cn/article/dsccpjd.html