這一篇博客主要講鍵的創建,約束的創建。修改對象和刪除對象。 主鍵:主鍵是每行的唯一標識符,必須包含唯一值(因此不能為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>。
如何選擇數據完整性決策: