網(wǎng)站首頁 編程語言 正文
主鍵約束(PRIMARY KEY)
- 主鍵用于唯一地標識表中的每一條記錄,可以定義一列或多列為主鍵,一個表上僅只能有一個主鍵;
- 不建議更新主鍵;
- 主鍵列上沒有任何兩行具有相同值(即重復值),且不允許空(NULL);
- 主健可作外健,唯一索引不可;
唯一性約束(UNIQUE)
- 唯一性約束用來限制不受主鍵約束的列上的數(shù)據(jù)的唯一性,用于作為訪問某行的可選手段,一個表上可以放置多個唯一性約束;
- 只要唯一就可以更新;
- 表中任意兩行在指定列上都不允許有相同的值,但允許空(NULL);
唯一索引(UNIQUE INDEX)
- 唯一索引可以確保任何生成重復鍵值的嘗試都會失敗;
- 只要唯一就可以更新;
- 表中任意兩行在指定列上都不允許有相同的值,但允許空(NULL);
唯一性約束和主鍵約束的區(qū)別:
- 唯一性約束允許在該列上存在NULL值,而主鍵約束的限制更為嚴格,不但不允許有重復,而且也不允許有空值。
唯一約束和唯一索引的區(qū)別:
前者是用來檢查數(shù)據(jù)的正確性,后者用來實現(xiàn)數(shù)據(jù)查詢的優(yōu)化,目的不同。
唯一性約束與唯一索引有所不同:
- 創(chuàng)建唯一約束會在GBase 8s中創(chuàng)建一個constraint,同時也會創(chuàng)建一個該約束對應的唯一索引;
- 創(chuàng)建唯一索引只會創(chuàng)建一個唯一索引,不會創(chuàng)建constraint;
也就是說其實唯一約束是通過創(chuàng)建唯一索引來實現(xiàn)的。
以下示例來說明這三者之間的區(qū)別:
1,創(chuàng)建表、導入基礎(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);
查看表的報告,可以看到三個索引(對應主鍵、唯一約束和唯一索引),但需要注意的是主鍵、唯一約束的索引名稱并不是指定的約束名稱
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,測試區(qū)別
insert into tab1 values(null,'test004','test004');
將報錯誤:703: Primary key on table (tab1) has a field with a null key value.
不允許空值。
insert into tab1 values(3,'test005','test005');
將報錯誤:268: Unique constraint (gbasedbt.pk_tab1_col1) violated.
違反主鍵約束(pk_tab1_col1),因已經(jīng)存在值 3 。
insert into tab1 values(4,null,'test006');
將報錯誤:268: Unique constraint (gbasedbt.uk_tab1_col2) violated.
違反唯一約束(uk_tab1_col2),因已經(jīng)存在值 null 。
insert into tab1 values(5,'test003','test007');
將報錯誤:268: Unique constraint (gbasedbt.uk_tab1_col2) violated.
違反唯一約束(uk_tab1_col2),因已經(jīng)存在值 test003 。
insert into tab1 values(6,'test008',null);
將報錯誤:239: Could not insert new row - duplicate value in a UNIQUE INDEX column (Unique Index:ux_tab1_col3).
不允許插入重復值,因已經(jīng)存在值 null 。
insert into tab1 values(7,'test009','test002');
將報錯誤:239: Could not insert new row - duplicate value in a UNIQUE INDEX column (Unique Index:ux_tab1_col3).
不允許插入重復值,因已經(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
刪除約束,對應的索引一并刪除。
細心的你,會發(fā)現(xiàn):
- 如果字段加上not null約束,再加上唯一約束或者唯一索引,功能上將等同于主鍵約束;
- 唯一約束僅僅比唯一索引多了一個約束;
原文鏈接:https://blog.csdn.net/liaosnet/article/details/122482036
相關(guān)推薦
- 2023-05-21 Django項目搭建之實現(xiàn)簡單的API訪問_python
- 2022-05-31 Android接入ffmpeg庫及問題解決方法_Android
- 2023-04-07 React?Fiber構(gòu)建completeWork源碼解析_React
- 2023-01-20 C++利用模板實現(xiàn)消息訂閱和分發(fā)功能_C 語言
- 2023-02-04 golang?Gorm框架講解_Golang
- 2023-05-24 Android打空包后提示沒有"android:exported"的屬性設置問題解決_Android
- 2022-09-15 .Net站點設置多個路由對應同一個Action_實用技巧
- 2022-10-17 Matlab實現(xiàn)帶豎線散點的核密度圖的繪制_C 語言
- 最近更新
-
- window11 系統(tǒng)安裝 yarn
- 超詳細win安裝深度學習環(huán)境2025年最新版(
- Linux 中運行的top命令 怎么退出?
- MySQL 中decimal 的用法? 存儲小
- get 、set 、toString 方法的使
- @Resource和 @Autowired注解
- Java基礎(chǔ)操作-- 運算符,流程控制 Flo
- 1. Int 和Integer 的區(qū)別,Jav
- spring @retryable不生效的一種
- Spring Security之認證信息的處理
- Spring Security之認證過濾器
- Spring Security概述快速入門
- Spring Security之配置體系
- 【SpringBoot】SpringCache
- Spring Security之基于方法配置權(quán)
- redisson分布式鎖中waittime的設
- maven:解決release錯誤:Artif
- restTemplate使用總結(jié)
- Spring Security之安全異常處理
- MybatisPlus優(yōu)雅實現(xiàn)加密?
- Spring ioc容器與Bean的生命周期。
- 【探索SpringCloud】服務發(fā)現(xiàn)-Nac
- Spring Security之基于HttpR
- Redis 底層數(shù)據(jù)結(jié)構(gòu)-簡單動態(tài)字符串(SD
- arthas操作spring被代理目標對象命令
- Spring中的單例模式應用詳解
- 聊聊消息隊列,發(fā)送消息的4種方式
- bootspring第三方資源配置管理
- GIT同步修改后的遠程分支