SQL入門經典(五)之鍵和約束

来源:http://www.cnblogs.com/panda951010/archive/2016/06/21/5600351.html
-Advertisement-
Play Games

這一篇博客主要講鍵的創建,約束的創建。修改對象和刪除對象。 主鍵:主鍵是每行的唯一標識符,必須包含唯一值(因此不能為NULL)。由於主鍵在關係中資料庫的重要性,因此它是所有鍵和約束中最重要的。一個表最多可以有一個主鍵。很少不需要主鍵的表。主鍵聲明具有唯一性。常用有identity自動增長值和GUID ...


這一篇博客主要講鍵的創建,約束的創建。修改對象和刪除對象。

主鍵:主鍵是每行的唯一標識符,必須包含唯一值(因此不能為NULL)。由於主鍵在關係中資料庫的重要性,因此它是所有鍵和約束中最重要的。一個表最多可以有一個主鍵。很少不需要主鍵的表。主鍵聲明具有唯一性。常用有identity自動增長值和GUID。主鍵是唯一標識值。如果客戶操作一個沒有主鍵的表。連續添加2次一樣數據。你怎麼刪除。刪除總是2條一條刪除。我們接著上篇博客。

下麵創建一個主鍵表:

USE panda 
GO   --轉為panda資料庫操作

CREATE TABLE test002
(
   ID  int identity(1,1) primary key,--創建主鍵
   name  nvarchar(20)  not null,
   age     int                default(0)  check(age>=0) --創建了預設值和Check約束
)

表結構查詢,執行exec sp_helpconstraint test002,查詢到3條。PK__test002__7C8480AE是這個表主鍵。

我們刪除這條主鍵在重新創建主鍵:

 ALTER TABLE test002
 drop  CONSTRAINT PK__test002__7C8480AE--PK__test002__7C8480AE這個資料庫預設生成的。我們刪除她,用腳本創建
GO--告訴資料庫執行前面語句

ALTER TABLE test002
ADD  CONSTRAINT PK_test002_ID
PRIMARY  KEY(ID) --創建主鍵

GO

exec  sp_helpconstraint test002 --- 結果還是3條。主鍵名稱已經改成了PK_test002_ID

先對來說比較簡單。

外鍵:外鍵能確保數據完整性,也能表現表之間的關係,如果添加外鍵到一個表,就是在你定義外鍵表(引用表)和外鍵引用的表(被引用表)之間創建依賴關係。添加外鍵之後,插入引用表數據要麼必須與被引用表引用列數據匹配某條記錄。

試一試:創建一個帶有外鍵表。我們在panda數據創建一個test003的表

CREATE TABLE test003
(
   ID int identity(1,1) primary key,
   test002ID  int     foreign key references test002(ID),--創建外鍵
   OrderDate  datetime  default(getdate()),
   name         nvarchar(20) not null 
)
GO 
exec  sp_helpconstraint test003 --查詢到系統預設生成FK__test003__test002__023D5A04名稱外鍵

外鍵約束可以在表中建立0-253個。主鍵約束只能一個,外鍵約束可以多個。每列只能引用外鍵值。和主鍵創建方式差不多。刪除差不多。試一試使用腳本創建外鍵:我先刪除上面那個表外鍵

ALTER TABLE test003
drop CONSTRAINT FK__test003__test002__023D5A04.--刪除外鍵
GO
ALTER TABLE test003
ADD CONSTRAINT FK_T003_T002_ID
FOREIGN KEY (test002ID) REFERENCES test002(ID)--創建外鍵,引用test002的ID外鍵

go

exec sp_helpconstraint test003--外鍵信息已經更新到 FK_T003_T002_ID

是不是看起來很簡單;外鍵可選級聯操作。外鍵是雙向,不僅限制子表值存在,也限制父表中。每次對父表刪除時候先檢查一次子表是否有數據(防止子表孤立數據).

CREATE TABLE test003
(
   ID int identity(1,1) primary key,
   test002ID  int     foreign key references test002(ID)
   ON UPDATE NOT ACTION
   ON DELETE CASCADE,
   ,--創建外鍵
   OrderDate  datetime  default(getdate()),
   name         nvarchar(20) not null 
)---下麵一一介紹。外鍵ON後面可以跟4個參數。SET NULL,SET DEFAULT,NOT ACTION ,CASCADE

NOT ACTION:執行刪除和更新操作時候會總拒絕執行,因為子集數據無法得到更新,防止數據孤立和完整性。所以被引用表被執行時候就被拒絕執行

CASCADE:刪除和更新會更新子集數據。刪除被引用表數據會傳播到引用表數據;為了數據完整性和不使數據孤立,連子表數據一起更新和刪除操作。

SET DEFAULT和SET NULL:如果被引用表被刪除。引用表外鍵數據會設置一個預設值或者NULL。

UNIQUE唯一約束:這些約束相對來說比較簡單。唯一約束可以做候選主鍵。和主鍵差不多。他們共同點要求表中指定列只有唯一指定值。唯一不同點。唯一約束沒有看作表中唯一標識符。一個表可以有多個唯一約束,主鍵只有一個。如果插入2個一樣的唯一約束值,sql會拒絕執行。試一試:

ALTER TABLE test002
add
   email  nvarchar(50) not null
   unique ,--創建唯一約束
   phone  nvarchar(12) not null

GO

ALTER TABLE test002
add constraint  UK_test002_phone
UNIQUE(phone) --給phone欄位創建唯一約束

exec sp_helpconstraint test002--你會發現多了2個唯一約束。

CHECK約束:check約束較好她不限於一個特殊的列。CHECK約束可以跟一個列關聯,但是也可以跟一個表關聯,可以使用更where字句來規則定義CHECK約束。

限制月份 CHECK(BETWEEN 1 AND 12),正確的手機號碼([1][3-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9])等等.

如何在表中加CHECK約束。test002建表age有check>0約束。我們給test003表中的OrderDate創建一個日期不能小於當前日期的約束

ALTER TABLE test003
ADD CONSTRAINT CK_TEST003_DATE
CHECK(OrderDate>=getdate())

DEFAULT約束:和所有約束一樣,比較讓人混淆。DEFAULT只能INSERT添加語句使用。如果沒有提供值就會預設值。如果提供該列值不會使用預設值。

如何在表中加default約束。test002建表OrderDate有default=getdate()約束。我們給test003表中的name添加一個“匿名用戶”的預設值

 

ALTER TABLE test002
ADD CONSTRAINT D_test002_name
Default('匿名用戶') for name

在創建約束忽略無效數據。因為已經輸入很多數據,現在建立的CHECK約束不能作用到以前約束。WITH NOCHECK欄位。

我們給test002數據添加約束

ALTER TABLE test002
add constraint CK_test002_phone
check(phone like '[1][3-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9]')--拋出錯誤信息 消息 547,級別 16,狀態 0,第 1 行
ALTER TABLE 語句與 CHECK 約束"CK_test002_phone"衝突。該衝突發生於資料庫"panda",表"dbo.test002",>column,phone因為數據已經存在不一樣數據如解決呢?在add前面加上with nocheck就可以了

ALTER TABLE test002
WITH NOCHECK
add constraint CK_test002_phone
check(phone like '[1][3-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9]')--命令已成功完成。

 禁用臨時的CHECK約束數據:

ALTER TABLE test002
NOCHECK
CONSTRAINT CK_test002_phone--就可以了。標誌這個約束已經禁用

ALTER TABLE test002
CHECK
CONSTRAINT CK_test002_phone--重新啟用這個約束。

規則和預設值:

規則創建: create rule <rule name> AS <expression>.

CREATE RULE Salary
AS  @Salary>0; --創建規則
--查看規則:exec sp_helptext <rule name>;會顯示文本信息

把規則綁定到數據列上語法: exec sp_bindrule '<rule name>','< object name>','<futureonly _flag>'. 如:exec sp_bindrule 'Salary','dbo.test002.age'.

移除綁定的規則:exec sp_unbindrule '< object name>' 如:exec sp_unbindrule 'dbo.test002.age'

刪除規則 DROP RULE <object name>

預設值創建:CREATE DEFAULT <default name> AS DEFAULT(default value)。

CREATE DEFAULT  SalaryDefault
AS 0;

綁定預設值:exec sp_bindefault '<rule name>','< object name>','<futureonly _flag>'.

移除綁定的預設值:exec sp_unbindefault '<obect name'>

刪除預設值:DROP DEFAULT <default name>

確定那些列使用規則和預設值:exec sp_depends <object name>。

如何選擇數據完整性決策:

 


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

-Advertisement-
Play Games
更多相關文章
  • 一個簡單的Java web伺服器實現,比較簡單,基於java.net.Socket和java.net.ServerSocket實現; 程式執行步驟 代碼實現 伺服器實現: Request類: Response類: 結果測試 訪問存在的資源文件(註意存放在工程目錄的webroot文件夾里): 訪問不存 ...
  • synchronized 是 java 多線程編程中用於使線程之間的操作串列化的關鍵字。這種措施類似於資料庫中使用排他鎖實現併發控制,但是有所不同的是,資料庫中是對數據對象加鎖,而 java 則是對將要執行的代碼加鎖。 在 java 中使用 synchronized 關鍵字時需要註意以下幾點: 1. ...
  • 1.啟動zookeeper集群 對於hadoop,使用Zookeeper的事件處理確保整個集群只有一個活躍的NameNode,存儲配置信息,對於HBase,使用Zookeeper的事件處理確保整個集群只有一個HMaster,察覺HRegionServer的聯機和宕機,存儲訪問控制列表等 啟動命令:c ...
  • 用戶反映記賬操作時,提示ora-25153:臨時表空間為空 1、先查詢表空間情況:select * from dba_tablespaces where contents='TEMPORARY';查詢返回兩條記錄,說明存在兩個臨時表空間,如下: 2、再查看視圖dba_temp_files和v$tem ...
  • 如圖 我使用的是sqlserver2012登錄的,select @@version 查詢出來的卻是2008 ,而且附加不了2012的資料庫。 在網上搜到解決方法:1確認是否安裝了2012(廢話沒安裝是不能啟動的),2確認2012的服務有沒有啟動 3.選擇2012的伺服器: 這種情況主要發生在多資料庫 ...
  • 如何正確地建立SCOTT/TIGER演示模式 執行腳本 (1)cd [ORACLE_HOME]/sqlplus/demo。 (2)以任意用戶身份連接後運行demobld.sql。 註:關於腳本文件的位置和名稱,不同的版本有所不同。 如我的Oracle版本是10G,並運行在Windows操作系統模式下 ...
  • 在一個項目中遇到的問題:系統日誌過大,後來用delete語句刪除了(相當的慢),結果資料庫日誌又變成很大了(差不多10G),所以又得把資料庫日誌刪除。 方法: --備份系統中的部份日誌--SELECT * INTO #keep FROM CcsSystemLog WHERE logTime > '2 ...
  • 兩表聯合後,需要添加多個查詢條件的解決方案 一、 這是我第一次在項目組做融資租賃時遇到的問題,代碼如下: public ComposedBean OverdueReminder(Map param) throws CommonException{ ComposedBean composedBean ...
一周排行
    -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.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...