最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Postgresql中null值和空字符串舉例詳解

 更新時(shí)間:2024年02月03日 08:32:45   作者:魂醉  
在使用?PostgreSql時(shí),實(shí)際場(chǎng)景中會(huì)出現(xiàn)某個(gè)字段為空或空字符串,下面這篇文章主要給大家介紹了關(guān)于Postgresql中null值和空字符串的相關(guān)資料,需要的朋友可以參考下

NULL和空字符串不同數(shù)據(jù)庫的表現(xiàn)

null和空字符串在不同的數(shù)據(jù)庫中表現(xiàn)不一樣,找了一張圖,可以很清晰的對(duì)比了解。

首先null不是一個(gè)空字符串,也不是一個(gè)為零的值,上圖,Oracle將NULL和空字符串都視為NULL。PostgreSQL將NULL視為NULL,將空字符串視為空字符串。與PostgreSQL類似,SQL Server也將NULL視為NULL,將空字符串視為空字符串。

Oracle需要一個(gè)字節(jié)來存儲(chǔ)NULL。然而,PostgreSQL和SQL Server都不需要任何空間來存儲(chǔ)NULL。

在Oracle中,存在唯一約束的列可以存儲(chǔ)任意數(shù)量的NULL項(xiàng)和空字符串。
在SQL Server中,在一個(gè)列上存在唯一約束時(shí),只允許插入一個(gè)NULL和一個(gè)空字符串。
在PostgreSQL中,允許插入多個(gè)類似于Oracle的NULL值。與SQL Server類似,PostgreSQL的列存在唯一約束時(shí),只允許一個(gè)空字符串。

oracle和SQL Server不一一舉例,pg中例子如下:

#pg中,列b雖然有唯一越蘇,但可以插入多個(gè)null值
postgres=# create table tab(a bigint,b text, UNIQUE(b));
CREATE TABLE
postgres=# insert into tab values(1,null);
INSERT 0 1
postgres=# insert into tab values(1,null);
INSERT 0 1
#但是不能插入多個(gè)空字符串
postgres=# insert into tab values(2,'');
INSERT 0 1
postgres=# insert into tab values(2,'');
ERROR:  duplicate key value violates unique constraint "tab_b_key"
DETAIL:  Key (b)=() already exists.

從PostgreSQL 15開始,我們可以使用NULLS NOT DISTINCT子句來防止null值被處理為DISTINCT。這可以防止我們?cè)诰哂形ㄒ患s束的列中插入多個(gè)空值。

支持以下可選項(xiàng):

  • NULLS NOT DISTINCT null也被認(rèn)為是等同于null的, unique字段不能存多個(gè)null值;
  • NULLS DISTINCT 保持向后兼容, unique字段可以存儲(chǔ)多個(gè)null值.

創(chuàng)建索引也支持該選項(xiàng)

CREATE UNIQUE INDEX unique_idx1 ON unique_tbl (i) NULLS DISTINCT;
CREATE UNIQUE INDEX unique_idx2 ON unique_tbl (i) NULLS NOT DISTINCT;

看一下例子:

#創(chuàng)建測(cè)試表,插入null值,可見只能插入一個(gè),再插違反唯一約束
postgres=# CREATE TABLE tab(a text, b text, UNIQUE NULLS NOT DISTINCT(a));
CREATE TABLE
postgres=# insert into tab values (null);
INSERT 0 1
postgres=# insert into tab values (null);
ERROR:  duplicate key value violates unique constraint "tab_a_key"
DETAIL:  Key (a)=(null) already exists.

判斷和NULL值沖突的例子

有以下一張表,我們要確保a和b的組合是唯一的,并遵守以下兩個(gè)規(guī)則:

  • 如果b為NULL,那么a不能有重復(fù)的值插入
  • 如果b不為NULL,是其它的不同值,那么a可以插入重復(fù)的值
CREATE TABLE tab (
   a integer NOT NULL,
   b integer
);

-- 可插入
INSERT INTO tab VALUES (1, NULL);
-- 由于規(guī)則1,不能插入,因?yàn)閎為NULL
INSERT INTO tab VALUES (1, 2);
-- 可以插入
INSERT INTO tab VALUES (5, 2);
-- 可以插入,遵守規(guī)則2
INSERT INTO tab VALUES (5, 3);
-- 不能插入,違反規(guī)則1
INSERT INTO tab VALUES (5, NULL);

如果我們?cè)赼和b上建一個(gè)NULLS NOT DISTINCT的約束,可以實(shí)現(xiàn)上述要求嗎?

#創(chuàng)建唯一索引,插入數(shù)據(jù)測(cè)試,NULLS NOT DISTINCT不符合我們想要的效果
create unique index idx_tab_a_b on tab (a,b) NULLS NOT DISTINCT;
postgres=# INSERT INTO tab VALUES (1, NULL);
INSERT 0 1
postgres=# INSERT INTO tab VALUES (1, 2);
INSERT 0 1
postgres=# INSERT INTO tab VALUES (5, 2);
INSERT 0 1
postgres=# INSERT INTO tab VALUES (5, 3);
INSERT 0 1
postgres=# INSERT INTO tab VALUES (5, NULL);
INSERT 0 1

使用Range Types實(shí)現(xiàn)目的

#Range Types幾個(gè)實(shí)例,[]表示閉區(qū)間,包括邊界,()表示開區(qū)間,不包括邊界
SELECT '[2022-09-15 00:00:00,2022-09-16 00:00:00)'::tsrange;
 
                    tsrange                    
═══════════════════════════════════════════════
 ["2022-09-15 00:00:00","2022-09-16 00:00:00")
 
SELECT '[-10,10]'::int4range;
 
 int4range 
═══════════
 [-10,11)
 
SELECT '[0,)'::numrange;
 
 numrange 
══════════
 [0,)

使用排除約束替代唯一約束

# 排除約束是使用GiST索引實(shí)現(xiàn)的,而GiST索引又是b樹索引的擴(kuò)展,我們需要安裝 btree_gist插件支持我們想要操作符
postgres=# CREATE EXTENSION IF NOT EXISTS btree_gist;
CREATE EXTENSION
postgres=# truncate tab ;
TRUNCATE TABLE

#解釋一下下面的排它約束,該約束表示不允許插入,a相等,b構(gòu)建的整數(shù)范圍相重疊的行,另外int4range(b, b, '[]')表示如果b不為NULL, int4range函數(shù)將構(gòu)造一個(gè)只包含b的整數(shù)范圍。如果b為NULL,則得到的范圍在兩端都是無界的。所以這正是我們測(cè)試所需要的
postgres=# ALTER TABLE tab ADD CONSTRAINT null_unique
EXCLUDE USING gist (
   a WITH =,
   int4range(b, b, '[]') WITH &&
);
ALTER TABLE
postgres=# INSERT INTO tab VALUES (1, NULL);
INSERT 0 1
postgres=# INSERT INTO tab VALUES (1, 2);
ERROR:  conflicting key value violates exclusion constraint "null_unique"
DETAIL:  Key (a, int4range(b, b, '[]'::text))=(1, [2,3)) conflicts with existing key (a, int4range(b, b, '[]'::text))=(1, (,)).
postgres=# INSERT INTO tab VALUES (5, 2);
INSERT 0 1
postgres=# INSERT INTO tab VALUES (5, 3);
INSERT 0 1
postgres=# INSERT INTO tab VALUES (5, NULL);
ERROR:  conflicting key value violates exclusion constraint "null_unique"
DETAIL:  Key (a, int4range(b, b, '[]'::text))=(5, (,)) conflicts with existing key (a, int4range(b, b, '[]'::text))=(5, [2,3)).

由上可見:

  • 在已知的情況下,不要使用NULL值表示任何含義,這將使得我們數(shù)據(jù)的操作更加復(fù)雜
  • 如果使用B樹索引的唯一約束不行,可以考慮使用GiST索引中通用的排它約束
  • 范圍數(shù)據(jù)類型的靈活使用

參考:

  • https://www.postgresql.org/docs/current/rangetypes.html
  • https://www.postgresql.org/docs/current/btree-gist.html
  • https://www.cybertec-postgresql.com/en/unique-constraint-null-conflicts-with-everything/
  • https://www.migops.com/blog/null-and-empty-string-in-oracle-vs-postgresql-vs-sql-server/

總結(jié) 

到此這篇關(guān)于Postgresql中null值和空字符串的文章就介紹到這了,更多相關(guān)Postgresql null值和空字符串內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • PostgreSQL 主從集群搭建

    PostgreSQL 主從集群搭建

    本文主要介紹了PostgreSQL 主從集群搭建,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2026-02-02
  • postgresql高級(jí)應(yīng)用之合并單元格的思路詳解

    postgresql高級(jí)應(yīng)用之合并單元格的思路詳解

    這篇文章主要介紹了postgresql高級(jí)應(yīng)用之合并單元格,本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2021-05-05
  • 使用psql操作PostgreSQL數(shù)據(jù)庫命令詳解

    使用psql操作PostgreSQL數(shù)據(jù)庫命令詳解

    這篇文章主要為大家介紹了使用psql操作PostgreSQL數(shù)據(jù)庫命令詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2023-08-08
  • PostgreSQL實(shí)現(xiàn)定期備份的方法

    PostgreSQL實(shí)現(xiàn)定期備份的方法

    PostgreSQL定期備份功能可以自動(dòng)備份數(shù)據(jù)庫,避免了手動(dòng)備份過程中可能發(fā)生的錯(cuò)誤,也極大地減輕了管理員的工作壓力,所以本文將給大家介紹一下PostgreSQL實(shí)現(xiàn)定期備份的方法,需要的朋友可以參考下
    2024-03-03
  • PostgreSQL?auto_explain的具體使用

    PostgreSQL?auto_explain的具體使用

    PostgreSQL auto_explain插件自動(dòng)記錄慢SQL執(zhí)行計(jì)劃,支持全局、會(huì)話及用戶級(jí)別加載,具有一定的參考價(jià)值,感興趣的可以了解一下
    2025-06-06
  • postgresql 查詢集合結(jié)果用逗號(hào)分隔返回字符串處理的操作

    postgresql 查詢集合結(jié)果用逗號(hào)分隔返回字符串處理的操作

    這篇文章主要介紹了postgresql 查詢集合結(jié)果用逗號(hào)分隔返回字符串處理的操作,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧
    2021-02-02
  • PostgreSQL邏輯復(fù)制解密原理解析

    PostgreSQL邏輯復(fù)制解密原理解析

    邏輯復(fù)制,是基于復(fù)制標(biāo)識(shí)復(fù)制數(shù)據(jù)及其變化的一種方法,區(qū)別于物理復(fù)制對(duì)頁面操作的描述,邏輯復(fù)制是對(duì)事務(wù)及數(shù)據(jù)元組的一種描述,這篇文章主要介紹了PostgreSQL邏輯復(fù)制解密原理解析,需要的朋友可以參考下
    2022-09-09
  • postgresql 除法保留小數(shù)位的實(shí)例

    postgresql 除法保留小數(shù)位的實(shí)例

    這篇文章主要介紹了postgresql 除法保留小數(shù)位的實(shí)例,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧
    2021-01-01
  • PostgreSQL 查看表的主外鍵等約束關(guān)系詳解

    PostgreSQL 查看表的主外鍵等約束關(guān)系詳解

    這篇文章主要介紹了PostgreSQL 查看表的主外鍵等約束關(guān)系詳解,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧
    2021-01-01
  • postgresql限制某個(gè)用戶僅連接某一個(gè)數(shù)據(jù)庫的操作

    postgresql限制某個(gè)用戶僅連接某一個(gè)數(shù)據(jù)庫的操作

    這篇文章主要介紹了postgresql限制某個(gè)用戶僅連接某一個(gè)數(shù)據(jù)庫的操作,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧
    2021-01-01

最新評(píng)論

墨竹工卡县| 夏邑县| 兴业县| 林口县| 和田市| 麦盖提县| 门头沟区| 合肥市| 来安县| 广德县| 旅游| 军事| 宁化县| 行唐县| 永州市| 元朗区| 桃园县| 巴青县| 巴塘县| 镇安县| 龙川县| 永清县| 呼玛县| 延川县| 青海省| 库伦旗| 安庆市| 宾阳县| 巴马| 岳阳市| 武定县| 合阳县| 临海市| 宝鸡市| 普安县| 枞阳县| 福贡县| 沽源县| 台中县| 永吉县| 文化|