GBase?8s數(shù)據(jù)庫(kù)主鍵約束、唯一約束和唯一索引的區(qū)別解析
主鍵約束(PRIMARY KEY)
- 主鍵用于唯一地標(biāo)識(shí)表中的每一條記錄,可以定義一列或多列為主鍵,一個(gè)表上僅只能有一個(gè)主鍵;
- 不建議更新主鍵;
- 主鍵列上沒(méi)有任何兩行具有相同值(即重復(fù)值),且不允許空(NULL);
- 主健可作外健,唯一索引不可;
唯一性約束(UNIQUE)
- 唯一性約束用來(lái)限制不受主鍵約束的列上的數(shù)據(jù)的唯一性,用于作為訪問(wèn)某行的可選手段,一個(gè)表上可以放置多個(gè)唯一性約束;
- 只要唯一就可以更新;
- 表中任意兩行在指定列上都不允許有相同的值,但允許空(NULL);
唯一索引(UNIQUE INDEX)
- 唯一索引可以確保任何生成重復(fù)鍵值的嘗試都會(huì)失敗;
- 只要唯一就可以更新;
- 表中任意兩行在指定列上都不允許有相同的值,但允許空(NULL);
唯一性約束和主鍵約束的區(qū)別:
- 唯一性約束允許在該列上存在NULL值,而主鍵約束的限制更為嚴(yán)格,不但不允許有重復(fù),而且也不允許有空值。
唯一約束和唯一索引的區(qū)別:
前者是用來(lái)檢查數(shù)據(jù)的正確性,后者用來(lái)實(shí)現(xiàn)數(shù)據(jù)查詢的優(yōu)化,目的不同。
唯一性約束與唯一索引有所不同:
- 創(chuàng)建唯一約束會(huì)在GBase 8s中創(chuàng)建一個(gè)constraint,同時(shí)也會(huì)創(chuàng)建一個(gè)該約束對(duì)應(yīng)的唯一索引;
- 創(chuàng)建唯一索引只會(huì)創(chuàng)建一個(gè)唯一索引,不會(huì)創(chuàng)建constraint;
也就是說(shuō)其實(shí)唯一約束是通過(guò)創(chuàng)建唯一索引來(lái)實(shí)現(xiàn)的。
以下示例來(lái)說(shuō)明這三者之間的區(qū)別:
1,創(chuàng)建表、導(dǎo)入基礎(chǔ)數(shù)據(jù)
drop table if exists tab1; create table tab1(col1 int, col2 varchar(20), col3 varchar(20)); insert into tab1 values(1,'test001','test001'); insert into tab1 values(2,null,'test002'); insert into tab1 values(3,'test003',null);
2,創(chuàng)建主鍵、唯一約束和唯一索引
主鍵唯一值且不允許為null,唯一約束值唯一但允許null,唯一索引值唯一但允許null
alter table tab1 add constraint primary key(col1) constraint pk_tab1_col1; alter table tab1 add constraint unique(col2) constraint uk_tab1_col2; create unique index ux_tab1_col3 on tab1 (col3);
查看表的報(bào)告,可以看到三個(gè)索引(對(duì)應(yīng)主鍵、唯一約束和唯一索引),但需要注意的是主鍵、唯一約束的索引名稱并不是指定的約束名稱
oncheck -pt testdb:tab1 | grep 'fragment partition' Index 102_3 fragment partition datadbs01 in DBspace datadbs01 Index 102_4 fragment partition datadbs01 in DBspace datadbs01 Index ux_tab1_col3 fragment partition datadbs01 in DBspace datadbs01
3,測(cè)試區(qū)別
insert into tab1 values(null,'test004','test004');
將報(bào)錯(cuò)誤:703: Primary key on table (tab1) has a field with a null key value.
不允許空值。
insert into tab1 values(3,'test005','test005');
將報(bào)錯(cuò)誤:268: Unique constraint (gbasedbt.pk_tab1_col1) violated.
違反主鍵約束(pk_tab1_col1),因已經(jīng)存在值 3 。
insert into tab1 values(4,null,'test006');
將報(bào)錯(cuò)誤:268: Unique constraint (gbasedbt.uk_tab1_col2) violated.
違反唯一約束(uk_tab1_col2),因已經(jīng)存在值 null 。
insert into tab1 values(5,'test003','test007');
將報(bào)錯(cuò)誤:268: Unique constraint (gbasedbt.uk_tab1_col2) violated.
違反唯一約束(uk_tab1_col2),因已經(jīng)存在值 test003 。
insert into tab1 values(6,'test008',null);
將報(bào)錯(cuò)誤:239: Could not insert new row - duplicate value in a UNIQUE INDEX column (Unique Index:ux_tab1_col3).
不允許插入重復(fù)值,因已經(jīng)存在值 null 。
insert into tab1 values(7,'test009','test002');
將報(bào)錯(cuò)誤:239: Could not insert new row - duplicate value in a UNIQUE INDEX column (Unique Index:ux_tab1_col3).
不允許插入重復(fù)值,因已經(jīng)存在值 test002 。
insert into tab1 values(8,'test010','test010');
插入成功。
alter table tab1 drop constraint uk_tab1_col2;
oncheck -pt testdb:tab1 | grep 'fragment partition' Index 102_3 fragment partition datadbs01 in DBspace datadbs01 Index ux_tab1_col3 fragment partition datadbs01 in DBspace datadbs01
刪除約束,對(duì)應(yīng)的索引一并刪除。
細(xì)心的你,會(huì)發(fā)現(xiàn):
- 如果字段加上not null約束,再加上唯一約束或者唯一索引,功能上將等同于主鍵約束;
- 唯一約束僅僅比唯一索引多了一個(gè)約束;
到此這篇關(guān)于GBase 8s數(shù)據(jù)庫(kù)主鍵約束、唯一約束和唯一索引的區(qū)別的文章就介紹到這了,更多相關(guān)GBase 8s數(shù)據(jù)庫(kù)主鍵內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
圖文詳解如何在navicat中導(dǎo)入excel表格數(shù)據(jù)
Navicat可以方便的操作各種數(shù)據(jù)庫(kù),也提供了豐富的導(dǎo)入導(dǎo)出功能,下面這篇文章主要給大家介紹了關(guān)于如何在navicat中導(dǎo)入excel表格數(shù)據(jù)的相關(guān)資料,需要的朋友可以參考下2023-02-02SQL分組函數(shù)group by和聚合函數(shù)(COUNT、MAX、MIN、AVG、SUM)的幾點(diǎn)說(shuō)明
這篇文章主要介紹了SQL分組函數(shù)group by和聚合函數(shù)(COUNT、MAX、MIN、AVG、SUM)的幾點(diǎn)說(shuō)明,需要的朋友可以參考下2020-11-118 種常用的 NoSQL 數(shù)據(jù)庫(kù)系統(tǒng)對(duì)比分析
這篇文章主要介紹了8 種 NoSQL 數(shù)據(jù)庫(kù)系統(tǒng)對(duì)比,需要的朋友可以參考下2016-02-02使用Bucardo5實(shí)現(xiàn)PostgreSQL的主數(shù)據(jù)庫(kù)復(fù)制
這篇文章主要介紹了使用Bucardo5實(shí)現(xiàn)PostgreSQL的主數(shù)據(jù)庫(kù)復(fù)制,作者基于AWS給出演示,需要的朋友可以參考下2015-04-04通過(guò)navicat導(dǎo)入sql文件的操作方法
在很多項(xiàng)目當(dāng)中都有sql文件導(dǎo)入到MySQL數(shù)據(jù)庫(kù)的需要,因?yàn)橛衧ql數(shù)據(jù)庫(kù)文件,這個(gè)項(xiàng)目才能正常運(yùn)行起來(lái),那么現(xiàn)在就來(lái)學(xué)習(xí)一下怎么導(dǎo)入sql文件到navicat里面吧,需要的朋友可以參考下2024-03-03JDBC大批量寫(xiě)入數(shù)據(jù)到SQLServer2000,記錄數(shù)大于10000
JDBC大批量寫(xiě)入數(shù)據(jù)到SQLServer2000,記錄數(shù)大于100002009-12-12數(shù)據(jù)庫(kù)查詢中遭遇特殊字符導(dǎo)致問(wèn)題的解決方法
數(shù)據(jù)庫(kù)查詢中遭遇特殊字符導(dǎo)致問(wèn)題的解決方法,我們提供的是asp的,但其它的數(shù)據(jù)庫(kù)與語(yǔ)言下的解決方法也大同小異。2007-12-12使用SQL語(yǔ)句查詢MySQL,SQLServer,Oracle所有數(shù)據(jù)庫(kù)名和表名,字段名
本文例出了使用SQL語(yǔ)句查詢MySQL,SQLServer,Oracle所有數(shù)據(jù)庫(kù)名和表名的SQL語(yǔ)句,有需要的可以參考下2018-03-03pentaho工具將數(shù)據(jù)庫(kù)數(shù)據(jù)導(dǎo)入導(dǎo)出為Excel圖文步驟
本篇博客講述的是如何使用pentaho工具快速的將數(shù)據(jù)庫(kù)數(shù)據(jù)導(dǎo)出為Excel文件,以及如何將Excel文件數(shù)據(jù)導(dǎo)入數(shù)據(jù)庫(kù),有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步早日升職加薪2022-03-03MySQL與Oracle差異比較之五存儲(chǔ)過(guò)程&Function
這篇文章主要介紹了MySQL與Oracle差異比較之五存儲(chǔ)過(guò)程&Function,需要的朋友可以參考下2017-04-04