在實際開發中,可能很少人會手寫sql腳本來操作數據庫的種種。特別是微軟的MS SQL Server數據庫,它的SQL Server Management Studio對數據庫的圖形化操作極致簡便,從而導致很多人都不會或不熟悉使用SQL腳本操作數據庫。
接下面介紹的是我們日常開發中常規性的各種操作,先看看基本知識,隨后使用coding來表述。
SQL Server 常見五種約束:
Primary Key --主鍵約束
Foreign Key --外鍵約束
Unique --唯一約束
Default --默認值約束
Check --條件約束(邏輯判斷約束)
什么是主鍵?
在數據庫中,常常不只是一個表,這些表之間也不是相互獨立的。不同的表之間需要建立一種關系,才能將它們的數據相互溝通。而在這個溝通過程中,就需要表中有一個字段作為標志,不同的記錄對應的字段取值不能相同,也不能是空白的。通過這個字段中不同的值可以區別各條記錄。就像我們區別不同的人,每個人都有名字,但它卻不能作為主鍵,因為人名很容易出現重復,而身份證號是每個人都不同的,所以可以根據它來區別不同的人。數據庫的表中作為主鍵的字段就要像人的身份證號一樣,必須是每個記錄的值都不同,這樣才能根據主鍵的值來確定不同的記錄。
如果為表指定了 PRIMARY KEY 約束,則 SQL Server 2005 數據庫引擎 將通過為主鍵列創建唯一索引來強制數據的唯一性。當在查詢中使用主鍵時,此索引還可用來對數據進行快速訪問。因此,所選的主鍵必須遵守創建唯一索引的規則。
創建主鍵時,數據庫引擎 會自動創建唯一的索引來強制實施 PRIMARY KEY 約束的唯一性要求。如果表中不存在聚集索引或未顯式指定非聚集索引,則將創建唯一的聚集索引以強制實施 PRIMARY KEY 約束。
唯一性約束
1) 唯一性約束所在的列允許空值,但是主鍵約束所在的列不允許空值。
(2) 可以把唯一性約束放在一個或者多個列上,這些列或列的組合必須有唯一的只。但是,唯一性約束所在的列並不是表的主鍵列。
(3) 唯一性約束強制在指定的列上創建一個唯一性索引。在默認情況下,創建唯一性的非聚簇索引,但是,也可以指定所創建的索引是聚簇索引。
主鍵:
1) 用於標識某行而且與之相關.
2) 是不可能(或很難)更新.
3) 不應該允許空(NULL).
唯一域/字段:
1) 用於作為訪問某行的可選手段.
2) 只要唯一就可以更新.
3) 可以為空(NULLs).
注意唯一和主鍵的區別,它們都是創建一個唯一的索引,一個表格僅含有一個主鍵約束列,但是,它有可能在其他列中含有許多的唯一約束。
1、Primary Key約束
在表中常有一列或多列的組合,其值能唯一標識表中的每一行。
這樣的一列或多列成為表的主鍵(PrimaryKey)。一個表只能有一個主鍵,而且主鍵約束中的列不能為空值。只有主鍵列才能被作為其他表的外鍵所創建。
2、Foreign Key約束
外鍵約束是用來加強兩個表(主表和從表)的一列或多列數據之間的連接的。創建外鍵約束的順序是先定義主表的主鍵,然后定義從表的外鍵。也就是說只有主表的主鍵才能被從表用來作為外鍵使用,被約束的從表中的列可以不是主鍵,主表限制了從表更新和插入的操作。
3、Unique約束
唯一約束確保表中的一列數據沒有相同的值。與主鍵約束類似,唯一約束也強制唯一性,但唯一約束用於非主鍵的一列或者多列的組合,且一個表可以定義多個唯一約束。
4、Default約束
若在表中定義了默認值約束,用戶在插入新的數據行時,如果該行沒有指定數據,那么系統將默認值賦給該列,如果我們不設置默認值,系統默認為NULL。
5、Check約束
Check約束通過邏輯表達式來判斷數據的有效性,用來限制輸入一列或多列的值的范圍。在列中更新數據時,所要輸入的內容必須滿足Check約束的條件,否則將無法正確輸入。
---創建數據庫,語句: create database 表名
Create database School
----刪除數據庫,語句:drop database 表名
drop database School
--創建數據表,語句:create table 表名( 字段A 類型 可空, 字段B 類型 可空)
Create Table Grade( Id int not null identity(1,1), --identity 設置字段自增長,步進值為1 Name nvarchar not null )
--創建主鍵約束,語句: alter table 表名 add constraint [主鍵名稱] primary key (主鍵字段)
alter table Grade Add constraint [PK_Grade] primary key (Id)
--創建唯一約束,語句: alter table 表名 add constraint [約束名稱] unique (字段 排序)
alter table Grade add constraint [IX_Grade_Name] unique (Id asc)
--創建數據表,語句:create table 表名( 字段A 類型 可空, 字段B 類型 可空)
create Table Student( Id int not null identity, Cid int not null, Name nvarchar(100) not null, Gender nchar(8) not null )
--創建主鍵約束,語句: alter table 表名 add constraint [主鍵名稱] primary key (主鍵字段)
alter table Student Add constraint PK_Student primary key (Id)
--創建外鍵約束,語句: alter table 表名 add constraint [外鍵名稱] foreign key (字段) references 外鏈表名(字段)
alter table Student Add constraint FK_Student_Cid foreign key (Id) references Grade(Id)
--創建唯一約束,語句:alter table 表名 add constraint [約束名稱] unique (字段 排序)
alter table Student Add constraint IX_Student_Name unique (Id desc)
--創建Default約束,語句:alter table 表名 add constraint [約束名稱] default (默認值) for (字段)
alter table Student add constraint DF_Student_Gender default (N'男') FOR [Gender]
--創建Check約束,語句:alter table 表名 add constraint [約束名稱] check (邏輯表達式)
alter table Student add constraint CK_Student_Gender CHECK (([Gender]=N'男' OR [Gender]=N'女'))
--刪除約束,語句: alter table 表名 drop constraint [約束名稱]
alter table Student drop constraint IX_Student_Name
--修改字段,語句:alter table 表名 alter column [字段名] 類型 可空
alter table Grade alter column [Name] nvarchar(100) not null
--添加字段,語句:alter table 表名 add [字段名] 類型 可空
alter table Grade add [Year] char(8) not null
--刪除字段,語句:alter table drop column [字段名]
alter table Grade drop column [Year]
--填充數據
insert into Grade select N'一年級','2017' --方法一 insert into Grade(Name,[Year]) values (N'二年級','2017') --方法二 insert into Grade select N'三年級','2017' insert into Student select 2,N'張三','男' insert into Student select 2,N'李四','男' insert into Student select 3,N'王五','男' insert into Student select 3,N'趙六','男' insert into Student select 3,N'馬七','女'
--假設由於業務變更,我們需要給Student表新增非空IdNumber字段--
明天繼續....
