天天看點

SQL Server 資料庫設計和實作(三)

三、更新資料庫

(一)格式:具體格式請在“聯機叢書”中查找關鍵字“alter database”進行查詢

(二)相關示例:

   1、向資料庫中添加檔案:下例建立資料庫,并更改該資料庫以添加一個 5 MB 大小的新資料檔案。

      USE master

      GO

      CREATE DATABASE Test1

      ON

      (

       NAME = Test1dat1,

       FILENAME = 'c:/Program Files/Microsoft SQL Server/MSSQL/Data/t1dat1.ndf',

       SIZE = 5MB,

       MAXSIZE = 100MB,

       FILEGROWTH = 5MB

      )

      GO

      ALTER DATABASE Test1

      ADD FILE

      (

       NAME = Test1dat2,

       FILENAME = 'c:/Program Files/Microsoft SQL Server/MSSQL/Data/t1dat2.ndf',

       SIZE = 5MB,

       MAXSIZE = 100MB,

       FILEGROWTH = 5MB

      )

      GO

   2、向資料庫中添加由兩個檔案組成的檔案組:

      下例在示例 A 中所建立的 Test1 資料庫中建立一個檔案組,并将兩個 5 MB 的檔案添加到該檔案組。然後下例将 Test1FG1 設定為預設檔案組。

      USE master

      GO

      ALTER DATABASE Test1

      ADD FILEGROUP Test1FG1

      GO

      ALTER DATABASE Test1

      ADD FILE

      (

       NAME = test1dat3,

       FILENAME = 'c:/Program Files/Microsoft SQL Server/MSSQL/Data/t1dat3.ndf',

       SIZE = 5MB,

       MAXSIZE = 100MB,

       FILEGROWTH = 5MB

      ),

      (

       NAME = test1dat4,

       FILENAME = 'c:/Program Files/Microsoft SQL Server/MSSQL/Data/t1dat4.ndf',

       SIZE = 5MB,

       MAXSIZE = 100MB,

       FILEGROWTH = 5MB

      )

      TO FILEGROUP Test1FG1

      ALTER DATABASE Test1

      MODIFY FILEGROUP Test1FG1 DEFAULT

      GO

   3、向資料庫中添加兩個日志檔案:下例向資料庫中添加兩個 5 MB 大小的日志檔案。

      USE master

      GO

      ALTER DATABASE Test1

      ADD LOG FILE

      (

       NAME = test1log2,

       FILENAME = 'c:/Program Files/Microsoft SQL Server/MSSQL/Data/test2log.ldf',

       SIZE = 5MB,

       MAXSIZE = 100MB,

       FILEGROWTH = 5MB

      ),

       (

       NAME = test1log3,

       FILENAME = 'c:/Program Files/Microsoft SQL Server/MSSQL/Data/test3log.ldf',

       SIZE = 5MB,

       MAXSIZE = 100MB,

       FILEGROWTH = 5MB

      )

      GO

   4、從資料庫中删除檔案:下例将示例 B 中添加到資料庫 Test1 中的一個檔案删除。

      USE master

      GO

      ALTER DATABASE Test1

      REMOVE FILE test1dat4

      GO

   5、更改檔案:下例将示例 B 中添加到資料庫 Test1 中的一個檔案增加大小。

      USE master

      GO

      ALTER DATABASE Test1

      MODIFY FILE

      (

       NAME = test1dat3,

       SIZE = 20MB

      )

      GO

2.3 使用SQL語句建立和删除表

一、建立表

(一)格式:

      資料表的資訊一般存儲于各個資料庫中的sysobjects表中,在建立表格時,可以同IF EXISTS判斷語句一同使用

      CREATE TABLE 表名

      (

       字段1 資料類型 列的特征,

       字段2 資料類型 列的特征,

        ... ...

      )

      go

(二)參數分析:

   1、字段:表格中的字段名稱

   2、資料類型:詳見SQLSERVER應用開發

   3、列的特征:即對該列中的資料的相關限制,一般包括

      1)非空限制:是否允許列中的資料為null,允許可寫為NULL或不寫,不允許寫為NOT NULL

      2)預設值限制:當使用者沒有對列輸入資訊時,用預設值代替,可以寫為DEFAULT 預設值,如果字段為字元型,應寫為DEFAULT '預設值'

      3)唯一限制:對于該列的資料采用唯一性原則,即沒有重複的元素,可以包括null值,但隻能有一個,可寫為UNIQUE

      4)主鍵限制:将該列的資料設為主鍵,和唯一限制一樣,不存在重複的元素,但不能包括null,即主鍵不能為空

      5)外鍵限制:将從表中列的資料與主表中相關主鍵的資料相關聯,可寫為references 主表名(主鍵列名)

      6)檢查限制:對列中的資料進行格式上的限制,可寫為CHECK(條件表達式)

      7)辨別列:對于列的資料由系統從種子基數開始,按照種子遞增量自動增加,可寫為IDENTITY(種子基數,種子遞增量)

(三)相關示例:

   1、完整的表定義:

      下例顯示 pubs 資料庫中所建立的三個表(jobs、employee 和 publishers)的完整表定義,其中包含所有的限制定義。

      CREATE TABLE jobs

      (

       job_id smallint IDENTITY(1,1) PRIMARY KEY CLUSTERED, -- 将該列定義為自動增長的聚焦索引主鍵

       job_desc varchar(50) NOT NULL DEFAULT 'New Position - title not formalized yet', -- 将該列定義為非空字段并且有預設值

       min_lvl tinyint NOT NULL CHECK (min_lvl >= 10), -- 限制該列資料隻能為隻于10的整數

       max_lvl tinyint NOT NULL CHECK (max_lvl <= 250)

      )

      go

      CREATE TABLE employee

      (

       emp_id empid CONSTRAINT PK_emp_id PRIMARY KEY NONCLUSTERED CONSTRAINT CK_emp_id CHECK (emp_id LIKE '[A-Z][A-Z][A-Z][1-9][0-9][0-9][0-9][0-9][FM]' or emp_id LIKE '[A-Z]-[A-Z][1-9][0-9][0-9][0-9][0-9][FM]'),

       fname varchar(20) NOT NULL,

       minit char(1) NULL,

       lname varchar(30) NOT NULL,

       job_id smallint NOT NULL DEFAULT 1 REFERENCES jobs(job_id),

       job_lvl tinyint DEFAULT 10,

        pub_id char(4) NOT NULL DEFAULT ('9952') REFERENCES publishers(pub_id), hire_date datetime NOT NULL DEFAULT (getdate())

      )

      CREATE TABLE publishers

      (

       pub_id char(4) NOT NULL CONSTRAINT UPKCL_pubind PRIMARY KEY CLUSTERED CHECK (pub_id IN ('1389', '0736', '0877', '1622', '1756') OR pub_id LIKE '99[0-9][0-9]'),

       pub_name varchar(40) NULL,

        city varchar(20) NULL,

       state char(2) NULL,

       country varchar(30) NULL DEFAULT('USA')

      )

   2、在列中使用 uniqueidentifier 資料類型:

      下例建立含有 uniqueidentifier 列的表。該表使用 PRIMARY KEY 限制以確定使用者不會在表中插入重複的值,并在 DEFAULT 限制中使用 NEWID() 函數為新行提供值。

      CREATE TABLE Globally_Unique_Data

      (

       guid uniqueidentifier CONSTRAINT Guid_Default DEFAULT NEWID(),

       Employee_Name varchar(60),

       CONSTRAINT Guid_PK PRIMARY KEY (Guid)

      )

   3、對計算列使用表達式:下例顯示如何使用表達式 ((low + high)/2) 計算 myavg 計算列。

      CREATE TABLE mytable

      (

       low int,

       high int,

       myavg AS (low + high)/2

      )

   4、對計算列使用 USER_NAME 函數:下例在 myuser_name 列中使用 USER_NAME 函數。

      CREATE TABLE mylogintable

      (

       date_in datetime,

       user_id int,

       myuser_name AS USER_NAME()

      )

二、删除表

      格式:DROP TABLE 表名

2.4 使用SQL語句建立和删除限制

一、添加限制:

(一)格式:

      ALTER TABLE 表名

      ADD CONSTRAINT 限制名 限制類型 具體的限制說明

(二)相關示例:

   1、添加主鍵限制:

      為stuInfo表的stuNo字段添加主鍵限制(PRIMARY KEY),限制名為PK_stuNo

      ALTER TABLE stuInfo

      ADD CONSTRAINT PK_stuNo PRIMARY KEY (stuNo)

   2、添加唯一限制:

      為stuInfo表的stuId字段添加唯一限制(UNIQUE),限制名為UQ_stuId

      ALTER TABLE stuInfo

      ADD CONSTRAINT UQ_stuId UNIQUE (stuId)

   3、添加預設限制:

      ALTER TABLE stuInfo

      ADD CONSTRAINT DF_stuAddress DEFAULT ('位址不詳') FOR stuAddress

   4、添加檢查限制:年齡在15到40之間

      ALTER TABLE stuInfo

      ADD CONSTRAINT CK_stuAge CHECK (stuAge BETWEEN 15 AND 40)

   5、添加外鍵限制:将從表stuMarks中的stuNo列定義為外鍵并與主列中的stuNo列相關聯

      ALTER TABLE stuMarks

      ADD CONSTRAINT FK_stuNo FOREIGN KEY (stuNo) REFERENCES stuInfo (stuNo)

二、删除限制:

(一)格式: ALTER TABLE DROP CONSTRAINT 限制名

(二)相關示例:删除名為DF_stuAddress的限制

      ALTER TABLE DROP CONSTRAINT DF_stuAddress

三、擴充:修改表格的方法

(一)格式:參見“聯機叢書”,查找關鍵字“ALTER TABLE”

(二)相關示例:

   1、更改表以添加新列:

      下例添加一個允許空值的列,而且沒有通過 DEFAULT 定義提供值。各行的新列中的值将為 NULL。

       CREATE TABLE doc_exa

      (

       column_a INT

      )

      GO

      ALTER TABLE doc_exa

       ADD column_b VARCHAR(20) NULL

      GO

      EXEC sp_help doc_exa

      GO

      DROP TABLE doc_exa

      GO

   2、更改表以除去列:下例修改表以删除一列。

      CREATE TABLE doc_exb

      (

       column_a INT,

       column_b VARCHAR(20) NULL

      )

      GO

      ALTER TABLE doc_exb

       DROP COLUMN column_b

      GO

      EXEC sp_help doc_exb

      GO

      DROP TABLE doc_exb

      GO

3、更改表以添加具有限制的列:下例向表中添加具有 UNIQUE 限制的新列。

      CREATE TABLE doc_exc

      (

       column_a INT

      )

      GO

      ALTER TABLE doc_exc

       ADD column_b VARCHAR(20) NULL CONSTRAINT exb_unique UNIQUE

      GO

      EXEC sp_help doc_exc

      GO

      DROP TABLE doc_exc

      GO