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'