PosegreSQL基礎回顧(第 5 章 數據定義)

来源:https://www.cnblogs.com/soulxj/archive/2020/05/07/12841076.html
-Advertisement-
Play Games

來源:http://www.postgres.cn/docs/11/ 5.1. 表基礎 SQL並不保證表中行的順序。當一個表被讀取時,表中的行將以非特定順序出現,除非明確地指定需要排序。 嘗試移除一個不存在的表會引起錯誤。然而,在SQL腳本中在創建每個表之前無條件地嘗試移除它的做法是很常見的,即使發 ...


來源:http://www.postgres.cn/docs/11/

5.1. 表基礎

 SQL並不保證表中行的順序。當一個表被讀取時,表中的行將以非特定順序出現,除非明確地指定需要排序。 

 嘗試移除一個不存在的表會引起錯誤。然而,在SQL腳本中在創建每個表之前無條件地嘗試移除它的做法是很常見的,即使發生錯誤也會忽略之,因此這樣的腳本可以在表存在和不存在時都工作得很好(如果你喜歡,可以使用DROP TABLE IF EXISTS變體來防止出現錯誤消息,但這並非標準SQL)。

5.3.1. 檢查約束

一個檢查約束是最普通的約束類型。它允許我們指定一個特定列中的值必須要滿足一個布爾表達式。例如,為了要求正值的產品價格,我們可以使用: 

CREATE TABLE products (
    product_no integer,
    name text,
    price numeric CHECK (price > 0)
);

 更多

5.3.2. 非空約束

一個非空約束總是被寫成一個列約束。一個非空約束等價於創建一個檢查約束CHECK (column_name IS NOT NULL),但在PostgreSQL中創建一個顯式的非空約束更高效。這種方式創建的非空約束的缺點是我們無法為它給予一個顯式的名稱。

 NOT NULL約束有一個相反的情況:NULL約束。這並不意味著該列必須為空,進而肯定是無用的。相反,它僅僅選擇了列可能為空的預設行為。SQL標準中並不存在NULL約束,因此它不能被用於可移植的應用中(PostgreSQL中加入它是為了和某些其他資料庫系統相容)。但是某些用戶喜歡它,因為它使得在一個腳本文件中可以很容易的進行約束切換。例如,初始時我們可以:

CREATE TABLE products (
    product_no integer NULL,
    name text NULL,
    price numeric NULL
);

然後可以在需要的地方插入NOT關鍵詞。 

5.3.3. 唯一約束

唯一約束保證\在一列中或者一組列中保存的數據在表中所有行間是唯一的。

通常,如果表中有超過一行在約束所包括列上的值相同,將會違反唯一約束。但是在這種比較中,兩個空值被認為是不同的。

這意味著即便存在一個唯一約束,也可以存儲多個在至少一個被約束列中包含空值的行。

這種行為符合SQL標準,但我們聽說一些其他SQL資料庫可能不遵循這個規則。所以在開發需要可移植的應用時應註意這一點。

5.3.4. 主鍵

一個主鍵約束表示可以用作表中行的唯一標識符的一個列或者一組列。這要求那些值都是唯一的並且非空

一個表最多只能有一個主鍵(可以有任意數量的唯一和非空約束,它們可以達到和主鍵幾乎一樣的功能,但只能有一個被標識為主鍵)。

關係資料庫理論要求每一個表都要有一個主鍵。但PostgreSQL中並未強制要求這一點,但是最好能夠遵循它。

5.3.5. 外鍵

一個外鍵約束指定一列(或一組列)中的值必須匹配出現在另一個表中某些行的值。我們說這維持了兩個關聯表之間的引用完整性。 

我們知道外鍵不允許創建與任何產品都不相關的訂單。但如果一個產品在一個引用它的訂單創建之後被移除會發生什麼?SQL允許我們處理這種情況。直觀上,我們有幾種選項:

  • 不允許刪除一個被引用的產品

  • 同時也刪除引用產品的訂單

  • 其他? 

為了說明這些,讓我們在上面的多對多關係例子中實現下麵的策略:當某人希望移除一個仍然被一個訂單引用(通過order_items)的產品時 ,我們組織它。如果某人移除一個訂單,訂單項也同時被移除:

CREATE TABLE products (
    product_no integer PRIMARY KEY,
    name text,
    price numeric
);

CREATE TABLE orders (
    order_id integer PRIMARY KEY,
    shipping_address text,
    ...
);

CREATE TABLE order_items (
    product_no integer REFERENCES products ON DELETE RESTRICT,
    order_id integer REFERENCES orders ON DELETE CASCADE,
    quantity integer,
    PRIMARY KEY (product_no, order_id)
); 

限制刪除或者級聯刪除是兩種最常見的選項。

RESTRICT阻止刪除一個被引用的行

NO ACTION表示在約束被檢察時如果有任何引用行存在,則會拋出一個錯誤,這是我們沒有指定任何東西時的預設行為(這兩種選擇的本質不同在於NO ACTION允許檢查被推遲到事務的最後,而RESTRICT則不會)。

CASCADE指定當一個被引用行被刪除後,引用它的行也應該被自動刪除。

還有其他兩種選項:SET NULLSET DEFAULT。這些將導致在被引用行被刪除後,引用行中的引用列被置為空值或它們的預設值。註意這些並不會是我們免於遵守任何約束。例如,如果一個動作指定了SET DEFAULT,但是預設值不滿足外鍵約束,操作將會失敗。

ON DELETE相似,同樣有ON UPDATE可以用在一個被引用列被修改(更新)的情況,可選的動作相同。在這種情況下,CASCADE意味著被引用列的更新值應該被覆制到引用行中。 

正常情況下,如果一個引用行的任意一個引用列都為空,則它不需要滿足外鍵約束。如果在外鍵定義中加入了MATCH FULL,一個引用行只有在它的所有引用列為空時才不需要滿足外鍵約束(因此空和非空值的混合肯定會導致MATCH FULL約束失敗)。如果不希望引用行能夠避開外鍵約束,將引用行聲明為NOT NULL。 

一個外鍵所引用的列必須是一個主鍵或者被唯一約束所限制。這意味著被引用列總是擁有一個索引(位於主鍵或唯一約束之下的索引),因此在其上進行的一個引用行是否匹配的檢查將會很高效。由於從被引用表中DELETE一行或者UPDATE一個被引用列將要求對引用表進行掃描以得到匹配舊值的行,在引用列上建立合適的索引也會大有益處。由於這種做法並不是必須的,而且創建索引也有很多種選擇,所以外鍵約束的定義並不會自動在引用列上創建索引。

更多關於更新和刪除數據的信息請見第 6 章。外鍵約束的語法描述請參考CREATE TABLE

5.3.6. 排他約束

排他約束保證如果將任何兩行的指定列或表達式使用指定操作符進行比較,至少其中一個操作符比較將會返回否或空值。語法是:

CREATE TABLE circles (
    c circle,
    EXCLUDE USING gist (c WITH &&)
); 

詳見CREATE TABLE ... CONSTRAINT ... EXCLUDE

增加一個排他約束將在約束聲明所指定的類型上自動創建索引。 

5.8. 模式

一個資料庫包含一個或多個命名模式,模式中包含著表。模式還包含其他類型的命名對象,包括數據類型、函數和操作符。相同的對象名稱可以被用於不同的模式中二不會出現衝突,例如schema1myschema都可以包含名為mytable的表。和資料庫不同,模式並不是被嚴格地隔離:一個用戶可以訪問他們所連接的資料庫中的所有模式內的對象,只要他們有足夠的許可權。

下麵是一些使用方案的原因:

  • 允許多個用戶使用一個資料庫並且不會互相干擾。

  • 將資料庫對象組織成邏輯組以便更容易管理。

  • 第三方應用的對象可以放在獨立的模式中,這樣它們就不會與其他對象的名稱發生衝突。

模式類似於操作系統層的目錄,但是模式不能嵌套。 

5.8.2. 公共模式

在前面的小節中,我們創建的表都沒有指定任何模式名稱。預設情況下這些表(以及其他對象)會自動的被放入一個名為public”的模式中。

任何新資料庫都包含這樣一個模式。因此,下麵的命令是等效的:

CREATE TABLE products ( ... );   以及:   CREATE TABLE public.products ( ... ); 

5.9. 繼承

 PostgreSQL實現了表繼承,這對資料庫設計者來說是一種有用的工具(SQL:1999及其後的版本定義了一種類型繼承特性,但和這裡介紹的繼承有很大的不同)。

更多

5.10. 表分區

劃分指的是將邏輯上的一個大表分成一些小的物理上的片。

更多 

5.13. 依賴跟蹤

當我們創建一個涉及到很多具有外鍵約束、視圖、觸發器、函數等的表的複雜資料庫結構時,我們隱式地創建了一張對象之間的依賴關係網。例如,具有一個外鍵約束的表依賴於它所引用的表。

為了保證整個資料庫結構的完整性,PostgreSQL確保我們無法刪除仍然被其他對象依賴的對象。

 PostgreSQL中的幾乎所有DROP命令都支持CASCADE。當然,其本質的區別隨著對象的類型而不同。我們也可以用RESTRICT代替CASCADE來獲得預設行為,它將阻止刪除任何被其他對象依賴的對象。


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • ​作者:良知猶存 轉載授權以及圍觀:歡迎添加微信:Allen-Iverson-me-LYN 前言 最近想開發一段單片機的代碼,代碼本身有很多的重覆元素,這重覆定義的一些結構體使用起來有些繁瑣,所以就想用C++開發,C++的繼承 模板類可以很容易的解決這些問題。因為在單片機運行,習慣用MDK或者IAR ...
  • 第四天MySQL 連接查詢(內連接、外連接、交叉連接)(sql99版本下) 子查詢: select 後面(標量子查詢) from 後面(表子查詢) where 或having後面(標量子查詢、列子查詢、行子查詢) exists後面(相關子查詢)(表子查詢) ...
  • 來源:http://www.postgres.cn/docs/11/ 9.7. 模式匹配 PostgreSQL提供了三種獨立的實現模式匹配的方法:SQL LIKE操作符、更近一些的SIMILAR TO操作符(SQL:1999 里添加進來的)和POSIX-風格的正則表達式。除了這些基本的“這個串匹配這 ...
  • 本篇博客參考掘金小冊—— "MySQL 是怎樣運行的:從根兒上理解 MySQL" 先給大家講一個故事,我剛參加工作,在一個小作坊裡面當【碼畜】(儘管現在也是),有一天老闆從我背後走過,說了一句舉世震驚的話:我看你們的資料庫和excel一樣,不就是一行行數據,人家excel還可以對單元格進行美化,還有 ...
  • 業務情景 客戶環境是系統A的1.0版本,開發環境是系統A的2.0版本。2.0版本對於資料庫有部分變更(主要是新增表和欄位,不涉及欄位刪除和變更)。這個時候需要在客戶環境安裝資料庫2.0(表結構、存儲過程都是用的2.0),但是數據要把1.0的同步過來。 實際操作 1、 表結構複製 右擊2.0版本的數據 ...
  • 來源:http://www.postgres.cn/docs/11/ 6.4. 從修改的行中返回數據 有時在修改行的操作過程中獲取數據很有用。INSERT、 UPDATE和DELETE命令都有一個支持這個的可選的 RETURNING子句。使用RETURNING 可以避免執行額外的資料庫查詢來收集數據 ...
  • skip-name-resolve IP address 'XX.XX.XX.XX' has been resolved to the host name 'XX.XX.XX.XX.ro.ovo.sc', which resembles IPv4-address itself. ...
  • SpringMVC 初始SpringMVC 在 Spring 的基本架構中,紅色圈起來的 Spring Web MVC ,也就是本系列的主角 SpringMVC,它是屬於Spring基本架構裡面的一個組成部分,屬於SpringFrameWork的後續產品,已經融合在Spring Web Flow裡面 ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...