GaussDB 約束的使用舉例

1?not null 約束


not null 約束強制列不接受 null 值。not null 約束強制字段始終包含值。這意味著,如果不向字段添加值,就無法插入新記錄或者更新記錄。

GaussDB使用pg_get_tabledef()函數獲取customers表結構,如:

csdn=> set search_path=csdn;
SET
csdn=>
csdn=> select * from pg_get_tabledef('customers');pg_get_tabledef
---------------------------------------------------------------------------SET search_path = csdn;                                                  +CREATE TABLE customers (                                                 +id bigint NOT NULL,                                                  +name character varying(64),                                          +addr character varying(128),                                         +city character varying(64),                                          +zip integer,                                                         +province character varying(64) NOT NULL,                             +age integer                                                          +)                                                                        +WITH (orientation=row, compression=no, storage_type=USTORE, segment=off);
(1 row)

我們看到customers表的"客戶ID"與"省份"具有not null屬性,如果我們向表添加數據時就會觸發not null約束。

示例:

insert into customers(id,name,addr) values(90,'test not null','布吉吉華54號');

結果:

2 unique 約束

unique 約束唯一標識數據庫表中的每條記錄。unique 和 primary key 約束均為列或列集合提供了唯一性的保證。primary key 約束擁有自動定義的 unique 約束。請注意,每個表可以有多個unique 約束,但是每個表只能有一個 primary key?約束。

示例:我們創建Order表,設置訂單id列為unique屬性

create table if not exists orders 
(order_id   bigint,cust_id    bigint,empoyee_id  int,order_date    timestamp,ship_id       bigint,constraint unq_order_id unique(order_id)
);

結果:

如果我們的寫入orderid有重復值,就會報ERROR:Duplicate key value

注:unique列約束是允許寫入null值的:

insert into orders(order_id,cust_id,empoyee_id,order_date,ship_id) values(null,3,9,'2018-09-21 09:00:00.000',3);

3 primary key 約束

以customers表為例,客戶ID與客戶名稱組合列為主鍵。

create table customers
(id   bigint,name    varchar2(64),addr     varchar2(128),city     varchar2(64),zip      varchar2(64),province    varchar2(64),constraint prikey_id_name primary key(id,name)
);

結果:

寫入數據,如果客戶ID與客戶名稱同時存在2個相同數據時就會報錯。

insert into customers(id,name,addr,city,zip,province) values(1,'張三','北京路27號','上海','200000','上海市');
insert into customers(id,name,addr,city,zip,province) values(1,'李四','南京路12號','杭州','310000','浙江市');
insert into customers(id,name,addr,city,zip,province) values(1,'張三','北京路27號','上海','200000','上海市');

如果為primary key約束,同時任何為primary key字段不允許為null值,這個是與unique約束的區別。以下客戶名稱為空時會報:The null value in column "name"

insert into customers(id,name,addr,city,zip,province) values(1,null,'北京路27號','上海','200000','上海市');

結果:

4?foreign key 約束

一個表中的 foreign key 指向另一個表中的 primary key。讓我們通過一個實例來解釋外鍵。請看下面兩個表:

"customers" 表:? "orders" 表:

請注意:"orders" 表中的 "客戶id" 列指向 "customers" 表中的 "客戶 id" 列。"customers" 表中的 "客戶id" 列是 "customers" 表中的 primary key。"orders" 表中的 "客戶 id" 列是 "orders" 表中的 foreign key。foreign key 約束用于預防破壞表之間連接的行為。foreign key 約束也能防止非法數據插入外鍵列,因為它必須是它指向的那個表中的值之一。

首先:創建客戶表,主鍵為客戶ID

create table customers
(id   bigint,name    varchar2(64),addr     varchar2(128),city     varchar2(64),zip      varchar2(64),province    varchar2(64),constraint prikey_id primary key(id)
);

再次:創建訂單表,外鍵為客戶ID

create table if not exists orders 
(order_id   bigint,cust_id    bigint,empoyee_id  int,order_date    timestamp,ship_id       bigint,constraint unq_order_id unique(order_id),foreign key (cust_id) references customers(id)
);

結果:

當我們向訂單表寫入一條訂單,但是客戶ID不在客戶表的客戶ID時會報錯:ERROR: ?insert or update on table "orders" violates foreign key constraint

示例:

insert into customers(id,name,addr,city,zip,province) values(1,'張三','北京路27號','上海','200000','上海市');

向order表寫入一條訂單記錄,如果客戶ID不再customer表

 insert into orders(order_id,cust_id,empoyee_id,order_date,ship_id) values(1,3,9,'2018-09-21 09:00:00.000',3);

由此,我們應知道外鍵的含義了,沒有客戶哪里有訂單呢?必須是先有客戶才有訂單的。

5?default 約束

default 約束用于向列中插入默認值。如果沒有規定其他的值,那么會將默認值添加到所有的新記錄。

以下創建customers表省份為default約束:

alter table customers alter province set default '廣東省';

結果:

寫入時用default關鍵字:

 insert into customers(id,name,addr,city,zip,province) values(2,'李四','南京路12號','杭州','310000',default);

結果:

6 check 約束

如果對單個列定義 check 約束,那么該列只允許特定的值。如果對一個表定義 check 約束,那么此約束會基于行中其他列的值在特定的列中對值進行限制。

如:對于客戶來說需要符合法律年齡的中國人,那么年齡要大于或等于18歲,這個條件我們就可以設置check約束:

alter table customers add constraint check_age check(age>=18);

結果:

以上寫入一位李四的客戶年齡為16歲時報:violates check constraint

7??批注

?
以上六種約束是工作中經常使用到的,主要還是用來規范數據,隨著數據量的增多,如果不對表結構加以約束,那么會有越來越多的“臟數據”進入到數據庫,這對業務系統來說是非常不愿意碰到的。所以為了能夠高效的使用數據庫,請從表結構的設計上下更多的功夫.

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/diannao/94161.shtml
繁體地址,請注明出處:http://hk.pswp.cn/diannao/94161.shtml
英文地址,請注明出處:http://en.pswp.cn/diannao/94161.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

自動駕駛中的傳感器技術13——Camera(4)

1、自駕Camera開發的方案是否歸一化對于OEM,或者自駕方案商如Mobileye如果進行Camera的開發,一般建議采用Tesla的系統化最優方案,所有Camera統一某個或者某兩個MP設計(增加CIS議價權,減少Camera PCBA的設計維護數量&am…

開源利器:glTF Compressor——高效優化3D模型的終極工具

在3D圖形開發領域,glTF(GL Transmission Format)已成為Web和移動端3D內容的通用標準。然而,3D模型的文件體積和紋理質量往往面臨權衡難題。Shopify最新開源的glTF Compressor工具,為開發者提供了一套精細化、自動化的解決方案,讓3D模型優化既高效又精準。本文將深入解析這…

LeetCode Hot 100,快速學習,不斷更

工作做多了有時候需要回歸本心,認真刷題記憶一下算法。那就用我這練習時長兩年半的代碼農民工來嘗試著快速解析LeetCode 100吧 快速解析 哈希 1. 兩數之和 - 力扣(LeetCode) 這題很簡單啊,思路也很多 1. 暴力搜索,…

MySQL的子查詢:

目錄 子查詢的相關概念: 子查詢的分類: 角度1: 單行子查詢: 單行比較操作符: 子查詢的空值情況: 多行子查詢: 多行比較操作符: ANY和ALL的區別: 子查詢為空值的…

Python批處理深度解析:構建高效大規模數據處理系統

引言:批處理的現代價值在大數據時代,批處理(Batch Processing) 作為數據處理的核心范式,正經歷著復興。盡管實時流處理備受關注,但批處理在數據倉庫構建、歷史數據分析、報表生成等場景中仍不可替代。Pytho…

是德科技的BenchVue和納米軟件的ATECLOUD有哪些區別?

是德科技的BenchVue和納米軟件的ATECLOUD雖然都是針對儀器儀表測試的軟件,但是在功能設計、測試場景、技術架構等方面有著明顯的差異。BenchVue(是德科技)由全球領先的測試測量設備供應商開發,專注于高端儀器控制與數據分析&#…

線上redis的使用

一.String1.緩存玩家單個數據,但是我覺得還是用hash好2.結合過期時間,比如:某個東西結算了,redis記錄一下,并設置過期時間3.分布式鎖二.Hash1.緩存一個單位的數據,比如:聯盟信息2.被封禁的列表,…

【實踐記錄】github倉庫的更新

首先登錄,參考:記一次github連接本地git_如何連接github-CSDN博客 SSH: git config --global user.name "GitHubUsername" git config --global user.email "emailexample.com" ssh-keygen -t ed25519 -C "emailex…

Nature圖形復現—Graphpad繪制帶P值的含數據點的小提琴圖

帶 P 值的含數據點的小提琴圖是一種科研數據可視化圖表,它同時呈現數據的分布特征、原始觀測值和統計顯著性:通過小提琴形狀展示概率密度分布(反映數據集中趨勢和離散程度),疊加抖動散點顯示所有原始數據點&#xff08…

mongodb源代碼分析createCollection命令由create.idl變成create_gen.cpp過程

mongodb命令db.createCollection(name, options)創建一個新集合。由于 MongoDB 在命令中首次引用集合時會隱式創建集合,因此此方法主要用于創建使用特定選項的新集合。例如,您使用db.createCollection()創建:固定大小集合;集群化集…

達夢(DM8)常用管理SQL命令(3)

達夢(DM8)常用管理SQL命令(3) 1.表空間 -- 查看表空間信息 SQL> SELECT * FROM v$tablespace;-- 查看數據文件 SQL> SELECT * FROM v$datafile;-- 表空間使用情況 SQL> SELECT df.tablespace_name "表空間名稱",df.bytes/1024/1024 "總大小(MB)&q…

【Django】-5- ORM的其他用法

一、🚀 ORM 新增數據魔法!核心目標教你用 Django ORM 給數據庫 新增數據 !就像給數據庫 “生小數據寶寶”👶方法 1:實例化 Model save(一步步喂數據)obj Feedback() # 實例化 obj.quality d…

Flink Checkpoint機制:大數據流處理的堅固護盾

引言在大數據技術蓬勃發展的當下,數據處理框架層出不窮,Flink 憑借其卓越的流批一體化處理能力,在大數據流處理領域占據了舉足輕重的地位 。它以高吞吐量、低延遲和精準的一次性語義等特性,成為眾多企業處理實時數據的首選工具。在…

【STM32-HAL】 SPI通信與Flash數據寫入實戰

文章目錄1.參考教程2. 4種時間模式3. 3個編程接口3.1 HAL_StatusTypeDef HAL_SPI_Transmit(...) :3.1.1 參數說明3.1.2 例子3.2 HAL_StatusTypeDef HAL_SPI_Receive(...) :3.2.1參數說明3.2.2 例子3.3 HAL_StatusTypeDef HAL_SPI_TransmitReceive(...) &…

SNR-Aware Low-light Image Enhancement 論文閱讀

信噪比感知的低光照圖像增強 摘要 本文提出了一種新的低光照圖像增強解決方案,通過聯合利用信噪比(SNR)感知的變換器(transformer)和卷積模型,以空間變化的操作方式動態增強像素。對于極低信噪比&#xff0…

在 Vue3 中使用 Mammoth.js(在 Web 應用中預覽 Word 文檔)的詳解、常見場景、常見問題及最佳解決方案的綜合指南

一、Mammoth.js 簡介與核心功能 Mammoth.js 是一個專用于將 .docx 文檔轉換為 HTML 的庫,適用于在 Web 應用中預覽 Word 文檔。其核心特點包括: 語義化轉換:基于文檔樣式(如標題、段落)生成簡潔的 HTML 結構,忽略復雜樣式(如居中、首行縮進)。 輕量高效:適用于需要快…

2025 年 VSCode 插件離線下載硬核攻略

微軟 2025 年起關閉 VSCode 官方市場 .vsix 文件直接下載入口,給企業內網開發者帶來極大不便。不過別擔心,今天提供一個下載.vsix文件地址。 VSC插件下載 (dreamsoul.cn) 下載好的.vsix文件后,打開vscode的應用,選擇右上角...打開&#xff…

[leetcode] 位運算

位運算這類題目奇思妙招很多,優化方法更是非常考驗經驗積累。 常用小技能: bit_count():返回整數的二進制表示中1的個數,e.g. x 7 x.bit_count() # 32.bit_length():返回整數的二進制表示的長度,e.g. …

關于assert()函數,eval()函數,include

一.assert()函數例子assert("strpos($file, ..) false") or die("Detected hacking attempt!");assert("file_exists($file)") or die("That file doesnt exist!");第一個是會檢驗$file是否有.. ,如果有strpos會返回true&…

ICT模擬零件測試方法--電位器測試

ICT模擬零件測試方法–電位器測試 文章目錄ICT模擬零件測試方法--電位器測試電位器測試電位器測試配置電位器測試配置電位器測試注意事項電位器測量選項電位器測試 電位器測試測量從 0.1 歐姆到 10M 歐姆的電阻。 本節介紹: 電位器測試配置電位器測試注意事項電位…