約束
約束是在修改一個表,或增加一個表記錄時,規定表的各個字段之間必須滿足的關係.
ALTER TABLE student
ADD CONSTRAINT age_negative CHECK (student.age >= 0 );
約束是表結構的一部分內容,此例的約束是檢查年齡字段不要爲負值.
Update student set age=-1;//將會報錯.
刪除一個約束:alter table student drop constraint age_negative;
主鍵
主鍵:
表通常具有包含唯一標識表中每一行的值的一列或一組列。這樣的一列或多列稱爲表的主鍵 (PK),用於強制表的實體完整性。在創建或修改表時,您可以通過定義 PRIMARY KEY 約束來創建主鍵。
一個表只能有一個 PRIMARY KEY 約束,並且 PRIMARY KEY 約束中的列不能接受空值。由於 PRIMARY KEY 約束可保證數據的唯一性,因此經常對標識列定義這種約束。
create table dbo.test6
(
col1 nvarchar(25) NOT NULL DEFAULT 'abc',
col2 int DEFAULT 23 primary key
);
首先將原來的主鍵刪除,再建聯合主鍵
alter table test6 ADD CONSTRAINT constraint_1 PRIMARY KEY (col1,col2);在兩個字段上建聯合主鍵.
外鍵
外鍵 (FK) 是用於建立和加強兩個表數據之間的鏈接的一列或多列。當創建或修改表時可通過定義 FOREIGN KEY 約束來創建外鍵。
在外鍵引用中,當一個表的列被引用作爲另一個表的主鍵值的列時,就在兩表之間創建了鏈接。這個列就成爲第二個表的外鍵。
ALTER TABLE student
ADD CONSTRAINT FK_class FOREIGN KEY (class)
REFERENCES class (class) ;
刪除外鍵:alter table student drop CONSTRAINT FK_CLASS
建立外鍵時,要注意幾點:外鍵在外表中要是主鍵或索引. 兩個表的此字段名稱最好一樣.其他注意事項,項目參考相關數據庫的聯機幫助文檔.例如:外鍵在外表中重新生成,或重新組織後,或外鍵的索引被刪除後,引起的後果.需要仔細調試.
遊標
set ANSI_NULLS ON
set QUOTED_IDENTIFIER ON
go
ALTER PROCEDURE [dbo].[get_avage_age]
-- Add the parameters for the stored procedure here
@class_name nchar(10),
@CheckDate [datetime]
AS
BEGIN
-- SET NOCOUNT ON added to prevent extra result sets from
-- interfering with SELECT statements.
SET NOCOUNT ON;
select avg(age) from student where class=@class_name and time<@CheckDate
-- Insert statements for procedure here
DECLARE @cur_age as int
DECLARE @avg_age as numeric(8)
DECLARE @count as int
DECLARE curObject CURSOR FOR
select age from student
where class=@class_name and born<@CheckDate order by age
set @avg_age=0
set @count=0
OPEN curObject
FETCH NEXT FROM curObject INTO @cur_age
WHILE(@@FETCH_STATUS=0)
BEGIN
set @avg_age=@avg_age+@cur_age
set @count=@count+1
FETCH NEXT FROM curObject INTO @cur_age
END
set @avg_age=@avg_age/@count
SELECT 'AVAGE AGE' = @avg_age,'Student Sum' = @count
close curObject
deallocate curObject
END
在此存儲過程中, 使用遊標來讀取結果集中每個記錄的字段值,再求平均值,看看與avg函數的功能是否一樣的
使用遊標逐條更新記錄
DECLARE @cur_age as int
DECLARE @avg_age as numeric(8)
DECLARE @count as int
DECLARE curObject CURSOR FOR
select age from student
where class=@class_name and born<@CheckDate order by age
FOR UPDATE OF age,english
set @avg_age=0
set @count=0
OPEN curObject
FETCH NEXT FROM curObject INTO @cur_age
WHILE(@@FETCH_STATUS=0)
BEGIN
set @avg_age=@avg_age+@cur_age
set @count=@count+1
update student set english=@count where current of curObject
FETCH NEXT FROM curObject INTO @cur_age
END
set @avg_age=@avg_age/@count
SELECT 'AVAGE AGE' = @avg_age,'Student Sum' = @count
close curObject
deallocate curObject
根據遊標更新表,還有很多選項, 涉及到的細節請具體參考相關數據庫的聯機幫助!