日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

Oracle约数,Oracle约束简介

發布時間:2023/12/9 编程问答 39 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Oracle约数,Oracle约束简介 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

整理自《OCP認證指南》

001 概述

表約束是數據庫能夠實施業務規則以及保證數據遵循實體——關系模型的一種手段,其中,實體——關系模型由定義應用程序數據結構的系統分析所確定。

在針對定義了約束的表執行任何DML時,如果DML違反了約束,則將自動回滾整個語句。注意,如果一個DML語句影響到多個行,那么,在特定行遇到約束問題前,此語句可能已經局部成功。如果此語句是多語句事務的一部分,那么,事務中已經成功語句將保持完好,但不提交。

考點:如果違反約束,將自動回滾出現問題的整個語句,而不是語句中的單個操作,也不是整個事務。

002 約束類型

Oracle數據庫支持的約束類型如下:

·unique

·not Null

·primary key

·foreign key

·check

約束具有名稱。最好使用標準命名約定指定名稱,如果未顯式指定名稱,Oracle將為其生成名稱。

003 unique約束

unique約束要求,對于列或列組合而言,表中每行的值必須是不同的。如果此約束針對單個列,則相應的列稱為鍵(key)列。如果約束由多列組成(稱為組合鍵唯一約束),這些列并不必是相同的數據類 ? ?型,也不必在表定義中互相鄰近。

unique約束的怪異之處在于,可以在鍵列中輸入Null值。在鍵列中,可能有任意數量的包含Null值的行。因此,如果不搜索Null,則可以確保在鍵列上選擇時將僅返回一行;如果搜索Null,那么,鍵列為Null的所有行都將返回。

考點:對于具有unique約束的列,可以插入多個包含Null的行,而對于包含primary key約束的列而言,則不存在這種可能性。

unique約束通過索引來實施。在定義unique約束時,Oracle將查看鍵列上的索引,如果不存在,就創建一個。此后,每次插入行時,Oracle都將查看索引,了解鍵列的值是否已經存在。如果已存在,則將拒絕插入。這些索引(稱為B*樹索引)的結構不包含Null值,正因為如此,才允許出現多個包含Null的行:索引中根本不存在Null。雖然索引的第一要務是實施約束,但也有次生效應:如果在SQL語句的where子句中使用鍵列,性能將會提高。但是,選擇where key_column IS Null則不使用索引(因為它不包括Null),因此總是導致掃描整個表。

004 NOT Null約束

not Null約束強制在鍵列中輸入值。它針對每個列進行定義,有時被稱為強制列(mandatory column)。如果業務要求一組列都具有值,則不能為整個組定義not Null約束 ,而必須針對每列定義not Null約束。

如果嘗試插入沒有為具有not Null約束的列指定值的行,將導致錯誤。不懂?????

005 primary key約束

主鍵(primary key)定位表中單個行的方式。關系數據庫范例要求每個表都必須有主鍵,主鍵是用于區分每行的列或列組合。Oracle數據庫的定義與此范例有所不同,它允許存在不包含主鍵的表。

主鍵約束的實現實際上是unique和not Null約束的組合。鍵列必須具有唯一值,而且不得為空。與unique約束一樣,約束列上必須存在索引。如果不存在,將在定義約束時創建索引。一個表只能有一個主鍵,試著創建第二個,將出現錯誤。但是,表可以有任意數量的unique和not Null約束列。

考點:unique和primary key約束需要索引。如果不存在,就會自動予以創建。

006 foreign key約束

在父子關系的子表中定義foreign key約束。此約束使子表中的列(或列組合)對應父表的主鍵列。這些列不必同名,但數據類型必須相同。foreign key約束定義數據庫的關系結構:連接第三范式的表的多對一關系。

如果父表具有unique和/或primary key約束,則這些列可用作foreign key約束的基礎,即使允許使用Null值,也是如此。

考點:外鍵約束在子表上定義,但此時的父表上必須存在unique或primary key約束。

unique約束允許約束列中出現Null值,foreign key約束也同樣如此。即使父表的行中不存在Null,也可以將行插入到包含Null外鍵列的子表中。這會創建孤行,并產生令人不快的混亂。一般而言,unique約束中的所有列以及foreign key約束中的所有列最好也定義not Null約束,這往往是業務要求。

嘗試在子表中插入父表中沒有匹配行的行,將生成錯誤。同樣,如果父表中的某行在子表中已有引用它的行,則刪除相應的行將引發錯誤。可以使用兩種技術來更改此行為。首先,可將此約束創建為on delete cascade。這意味著,如果刪除父表中的行,那么Oracle將在子表中搜索所有匹配行,并刪除它們。這將自動發生。一個較溫和的技術是將約束創建為on delete set null。在此情況下,如果刪除父表中的行,Oracle將在子表中搜索所有的匹配行,并將外鍵列設為空。這意味著,子行將稱為孤行,但依然存在。如果子表中的列也有not Null約束,則父表上的刪除操作將失敗。

即使子表中沒有行,也不能刪除或截斷外鍵關系中的父表。如果使用on delete set Null或on delete cascade子句,這依然適用。

foreign key約束的一個變體是自引用foreign key約束。這將定義一個條件,其中的父行和子行存在于同一個表中。

007 check約束

check約束可用來實施簡單規則,如列中輸入的值必須在一個值域內。規則必須是一個結構為true或false的表達式。規則可以引用作為字面值輸入的絕對值,也可以引用同一行中的其它列,也可以使用一些函數。可以根據需要為一個列應用足夠多的check約束,但無法使用子查詢來計算值是否被允許,也無法使用諸如sysdate等函數。

提示:not Null約束實際上作為預配置check約束實現。

總結

以上是生活随笔為你收集整理的Oracle约数,Oracle约束简介的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。