1. 程式人生 > >SQL SERVER 語句建立資料庫和表以及設定主外來鍵關係

SQL SERVER 語句建立資料庫和表以及設定主外來鍵關係

簡單的建立資料庫的 SQL 語句:

use master
go

if exists(select * from sysdatabases where name='Test')
begin
    select '該資料庫已存在'
    drop database Test        --如果該資料庫已經存在,那麼就刪除它
end
else
begin
    create database Test
    on  primary        --表示屬於 primary 檔案組
    (
        name='stuDB_data',        -- 主資料檔案的邏輯名稱
        filename='D:\stuDB_data.mdf',    -- 主資料檔案的物理名稱
        size=5mb,    --主資料檔案的初始大小
        maxsize=100mb,     -- 主資料檔案增長的最大值
        filegrowth=15%        --主資料檔案的增長率
    )
    log on
    (
        name='stuDB_log',        -- 日誌檔案的邏輯名稱
        filename='D:\stuDB_log.ldf',    -- 日誌檔案的物理名稱
        size=2mb,            --日誌檔案的初始大小
        maxsize=20mb,        --日誌檔案增長的最大值
        filegrowth=1mb        --日誌檔案的增長率
    )
end

接下來是選擇資料表的 SQL 語句:

use Test    --表示設定為在該資料庫(Test)執行下面的SQL語句
go

建立表的sql語句:

if exists(select * from sysobjects where name='Student')
begin
    select '該表已經存在'
    drop table Student        --刪除表
end
else
begin
    create table Student
    (
        S_Id        int        not null    identity(1,1)    primary key,    --設定為主鍵和自增長列,起始值為1,每次自增1
        S_StuNo        varchar(50)         null,
        S_Name        varchar(20)         null,
        S_Sex        varchar(10)         null,
        S_Height    varchar(10)        null,
        S_BirthDate Datetime  not null default getdate()
    )
end

新增約束的sql語句:

--新增約束                        
alter table Student add constraint 
UQ_S_StuNo    --約束名
unique        --約束型別(唯一約束)
(S_StuNo)    --列名

--刪除約束
alter table Student drop constraint
UQ_S_StuNo    --約束名

 

表變數:

--建立表變數
declare @Score table
(
    Id        int        not null,
    Name    varchar(50)  null

insert into @Score
select '1','劉邦' union
select '2','項羽'

select * from @Score

 

if exists(select * from sysObjects where name='Course')
begin
    select '該表已經存在'
    drop table Course
end
else
begin
    --建立了外來鍵的表(主表)中如果有和關聯表的資料,那麼關聯表即從表中的是無法刪除的
    --在主表插入從表中外來鍵列沒有的資料時是無法插入的
    --即:建立外來鍵的表 插入時從表要有資料,刪除無障礙
    --                  從表插入無障礙,刪除時要刪除主表
    
--總結:有外來鍵時,刪除時先刪除主表中資料;插入時,根據從表資料插入     從刪看主,主插看從
    create table Course     --主表
    (
      --列名    欄位型別  是否為空   標識外來鍵列(外來鍵列名)         關聯表的表名(關聯的欄位名)
         Stu_Id        int        null    foreign key(Stu_Id) references Student(S_Id),
         C_Id        int        not null    identity(1,1)    Primary key,
         C_Name        varchar(100)    not null
     )
end

 

測試資料:


--測試
--插入資料
declare @circle int,@Student_name nvarchar(100)
set @circle=1
while (@circle<11)
 begin
    set @Student_name =cast(newid() as nvarchar(100));
    insert into Student(S_Name) values('張三');
    set @[email protected]+1
 end  

--測試外來鍵
insert into Course (Stu_Id,C_Name)values(1,'語文')   --如果從表中S_Id沒有此資料1,則無法插入
delete from Student where S_Id=1                     --主表中有Stu_Id=1的話,無法刪除

 

附註:

-- ## 表示全域性臨時表
create table ##temp
(
    Id        int        not null,
    Name    varchar(10)        null
)

-- # 表示區域性臨時表
create table #temp
(
    Id        int        not null,
    Name    varchar(10)        null
)

臨時表介紹:

普通臨時表只在當前連線內有效,其它連線無法引用,當前連線斷開後就自動刪除。
全域性臨時表建立後,所有連線都可以引用此臨時表,只有當建立全域性臨時表的連線和引用全域性臨時表的連線全部都斷開後,全域性臨時表才被刪除。當建立全域性臨時表的連線斷開後,新的任務不能再引用它們。
多個連線同時引用並操作全域性臨時表時,就有可能引起併發衝突。

 

約束總結:

建立SQL的主鍵和外來鍵約束的方法:

create table Student --建表格式:create table 自定義的表名

( --欄位名一般為有一定意義的英文

StudentName nvarchar(15), -- 格式:欄位名型別()括號裡面的是允許輸入的長度

StudentAge int, --int型的後面不需要接長度

StudentSex nvarchar(2) --最後一個欄位後面不要逗號

)

--在建立表時就可以對欄位加上約束:

create table Student

(

StudentNo int PRIMARY KEY IDENTITY(1,1), --加主鍵約束,還有標識列屬性(兩者構成實體完整性)

StudentName nvarchar(15) not null, --加非空約束,不加"not null" 預設為:可以為空

StudentSchool text(20) FOREIGN KEY REFERENCES SchoolTable(SchoolName), --加外來鍵約束,格式:FOREIGN KEY REFERENCES 關聯的表名(欄位名)

StudentAge int DEFAULT ((0)), --加預設值約束

StudentSex nvarchar(2) CHECK(StudentSex=N'男' or StudentSex=N'女') --加檢查約束,格式:check (條件表示式)

)

--如果在表建立好了以後再加約束,則格式分別為:

-- 主鍵:

alter table 表名

add constraint PK_欄位名--"PK"為主鍵的縮寫,欄位名為要在其上建立主鍵的欄位名,'PK_欄位名'就為約束名

primary key (欄位名) --欄位名同上

--唯一約束:

alter table 表名

add constraint UQ_欄位名

unique (欄位名)

--外來鍵約束:

alter table 表名

add constraint FK_欄位名--"FK"為外來鍵的縮寫

foreign key (欄位名) references 關聯的表名(關聯的欄位名) --注意'關聯的表名'和'關聯的欄位名'

alter table 表A add constraint FK_B foreign key (ticket_no) references 表B(ticket_no)

alter table 表A add constraint FK_C foreign key (person_no) references 表C(person_no)

alter table 成績表 add constraint FK_StudentNo foreign key (StudentNo) references Student (StudentNo)

ON UPDATE CASCADE ON DELETE CASCADE

級聯更新,級聯刪除,這樣在刪除主表Student時,成績表中該學生的所有成績都會刪除。

--檢查約束:

alter table 表名

add constraint CK_欄位名

check (條件表示式) --條件表示式中的條件用關係運算符連線

--預設值約束:

alter table 表名

add constraint DF_欄位名

default '預設值' for 欄位名--其中的'預設值'為你想要預設的值,注意'for'

--刪除建立的約束:

alter table 表名

drop constraint 約束名--約束名為你前面建立的如:PK_欄位這樣的約束名

--注意:如果約束是在建立表的時候建立的,則不能用命令刪除

--只能在'企業管理器'裡面刪除

-- 獲取SqlServer中表結構

SELECT syscolumns.name,systypes.name,syscolumns.isnullable,

syscolumns.length

FROM syscolumns,systypes

WHERE syscolumns.xusertype = systypes.xusertype

AND syscolumns.id = OBJECT_ID('Student')

-- 單獨查詢表遞增欄位

SELECT [name] FROM syscolumns WHERE

id = OBJECT_ID(N'Student') AND COLUMNPROPERTY(id,name,'IsIdentity')=1

-- 獲取表主外來鍵約束

EXEC sp_helpconstraint 'StuResults'

-- 查詢表主鍵外來鍵資訊

SELECT sysobjects.id objectId,OBJECT_NAME(sysobjects.parent_obj) tableName,

sysobjects.name constraintName, sysobjects.xtype AS constraintType,

syscolumns.name AS columnName

FROM sysobjects INNER JOIN sysconstraints

ON sysobjects.xtype in('C', 'F', 'PK', 'UQ', 'D')

AND sysobjects.id = sysconstraints.constid

LEFT OUTER JOIN syscolumns ON sysconstraints.id = syscolumns.id

WHERE OBJECT_NAME(sysobjects.parent_obj)='StuResults'