--------创建数据库 ----use master ----GO ----IF EXISTS (SELECT name FROM master.dbo.sysdatabases WHERE name = 'test1') ----DROP DATABASE test1 ----GO ----CREATE DATABASE test1 ------创建教师表 --use test1 --go --if exists (select name from test1.dbo.sysobjects where name ='teacher') --drop table teacher --create table teacher --( --tno int not null primary key, --tname nvarchar(15) --) --go ----插入数据到教师表中 --insert into teacher(tno,tname) values(1,'小屋'); --insert into teacher(tno,tname) values(2,'DAVA'); --insert into teacher(tno,tname) values(3,'刘局'); --insert into teacher(tno,tname) values(4,'张厚'); ---- ----创建学生表 ----use test1 ---- go ---- if exists(select name from test1.dbo.sysobjects where name ='student') ---- drop table studnet ----create table student ---- ( ---- sno int not null primary key, ---- sname nvarchar(15) not null, ---- sage datetime not null, ---- ssex char(2) not null ------ ) ------go ------插入数据 ----INSERT INTO student(sno,sname,sage,ssex) VALUES(1,'张三','1980-1-23','男') ----INSERT INTO student(sno,sname,sage,ssex) VALUES(2,'李四','1982-12-12','男') ----INSERT INTO student(sno,sname,sage,ssex) VALUES(3,'张飒','1981-9-9','男') ----INSERT INTO student(sno,sname,sage,ssex) VALUES(4,'莉莉','1983-3-23','女') ----INSERT INTO student(sno,sname,sage,ssex) VALUES(5,'王弼','1982-6-21','男') ----INSERT INTO student(sno,sname,sage,ssex) VALUES(6,'王丽','1984-10-10','女') ----.创建课程表 --CREATE TABLE [dbo].[course]( -- [cno] [int] NOT NULL PRIMARY KEY, -- [cname] [nvarchar](20) NOT NULL, -- [tno] [int] NOT NULL --) ----创建外键,已经存在两张表,我想用sql语句建立这两张表的主外键关系 ----ALTER TABLE 表名1 add constraint 约束名 foreign key(字段) references 表名2(字段) --alter table course add constraint course_to_student foreign key(tno) references teacher(tno); --ALTER TABLE [dbo].[course] WITH CHECK ADD --CONSTRAINT [FK_course_teacher] FOREIGN KEY([tno]) --REFERENCES [dbo].[teacher] ([tno]) ----插入数据 --insert into course(cno,cname,tno) values(1,'企业管理',3) --insert into course(cno,cname,tno) values(2,'马克思',1) --insert into course(cno,cname,tno) values(3,'UML',2) --insert into course(cno,cname,tno) values(4,'数据库',5) --insert into course(cno,cname,tno) values(5,'物理',8) --5.创建成绩表 use test1 if exists(select * from test1.dbo.sysobjects where id=object_id(N'[dbo].[sc]') and OBJECTPROPERTY(id, N'IsUserTable') = 1) drop table sc ----[dbo].[sc] go create table sc ( sno int not null, cno int not null, score float not null ) go --if exists (select * from dbo.sysobjects where id = object_id(N'[dbo].[table_name]') and OBJECTPROPERTY(id, N'IsUserTable') = 1) --drop table [dbo].[table_name] --GO --CREATE TABLE [dbo].[table_name] (....) --GO --创建外键 --alter table [dbo].[sc] with check add constraint [foreign_key1] foreign key([cno]) references [dbo].[course] ([cno]) --alter table [dbo].[sc] with check add constraint [foreign_key2] foreign key([sno]) references [dbo].[student] ([sno]) ALTER TABLE [dbo].[sc] WITH CHECK ADD CONSTRAINT [FK_sc_course] FOREIGN KEY([cno]) REFERENCES [dbo].[course] ([cno]) ALTER TABLE [dbo].[sc] WITH CHECK ADD CONSTRAINT [FK_sc_student] FOREIGN KEY([sno]) REFERENCES [dbo].[student] ([sno]) --删除外键 --第一步:找出指定表上的外键约束名字 --exec sp_helpconstraint 'dbo.sc' --第二步:删除外键约束 alter table [dbo].[studnet] drop constraint FK_sc_student --插入数据 INSERT INTO sc(sno,cno,score)VALUES(1,1,80) INSERT INTO sc(sno,cno,score)VALUES(1,2,86) INSERT INTO sc(sno,cno,score)VALUES(1,3,83) INSERT INTO sc(sno,cno,score)VALUES(1,4,89) INSERT INTO sc(sno,cno,score)VALUES(2,1,50) INSERT INTO sc(sno,cno,score)VALUES(2,2,36) --INSERT INTO sc(sno,cno,score)VALUES(2,3,43) INSERT INTO sc(sno,cno,score)VALUES(2,4,59) INSERT INTO sc(sno,cno,score)VALUES(3,1,50) INSERT INTO sc(sno,cno,score)VALUES(3,2,96) --INSERT INTO sc(sno,cno,score)VALUES(3,3,73) INSERT INTO sc(sno,cno,score)VALUES(3,4,69) 有一篇文章,不知道是否对你有帮助: SQL Server的系统表及其应用研究 1. SQL Server的系统表 Microsoft的SQL Server是一个可伸缩的高性能数据库管理系统,专为分布式客户机/服务器环境而设计,SQL Server几乎将所有的配置信息、安全性信息和对象信息都存储在了它自身的系统表中,而系统表存在于每个独立的数据库中,存储一个特定数据库对象信息的系统表通常称为数据库目录,MASTER数据库有其特有的系统表用于保存整个系统和所有数据库的信息,通常称为服务器目录或系统目录。 服务器上所有的数据库包括MODULE, MASTER等都含有18个具有相同名称、结构的系统表,如表SYSOBJECTS用于描述数据库中的对象棗表、视图、存储过程等,表SYSUSER用于描述数据库的用户,而MASTER数据库另外还有13个单独的全局系统表,如表SYSLOGINS用于保存每个服务器的登录名、口令和配置信息、表SYSDATABASE保存服务器上所有数据库名、所有者、状态及其他信息。 存储过程是内嵌于数据库中的程序代码,它与表、视图等一样是数据库的一个组成部分,不同于一般的外部程序代码,它是经过预编译处理的代码,因此具有运行速度快、效率高的特点,存储过程也是SQL Server的一个重要功能,许多单纯针对后台数据库的操作一般都交由存储过程来完成以提高系统效率。本文将给出一个存储过程来说明SQL Server系统表的应用。 2. SQL Server系统表的应用 在应用SQL Server的基于客户机/服务器体系结构的信息系统开发中,有时需要将后台SQL Server上的某一数据库的表结构都打印出来,以便于开发人员查阅及最终文档的形成。SQL Server本身提供了一个系统存储过程(SP_COLUMNS),可以完成对单个表结构的查询,只要在SLQ Server的ISQL-W工具中键入SP_COLUMNS“表名”,并执行即可得到结果集。但该方法有许多不足之处,其主要缺点是: 1)只能对数据库中单个数据表进行操作,当需要查询一个数据库中所有的表时,需要多次执行系统存储过程SP_COLUMNS,因此显得非常繁琐。 2)查询结果集中包含了许多不必要的信息,缺乏使用的灵活性。 下面我们创建一个存储过程来完成对某一个数据库中所有表结构的查询。 在创建一个数据库的同时,系统会自动建立一些系统表,限于篇幅的缘故我们在这里只介绍与应用实例有关的三个系统表(SYSOBJECTS,SYSCOLUMNS,SYSTYPES)及其相关的字段。 表SYSOBJECTS为数据库内创建的每个对象(约束,规则,表,视图,触发器等)创建一条记录。 该表相关字段的含义如下: SYSOBJECTS.name 对象名,如:表名,视图名。 SYSONJECTS.id 对象id。 SYSOBJECTS.type 对象类型(p存储过程,v视图,s系统表,u用户表)。 表SYSCOLUMNS为每个表、视图中的每个列和每个存储过程的每个参数创建一条记录。 该表相关字段的含义如下:(此处的列系指数据库中每个表、视图中的列) SYSCOLUMNS.id 该列所属的表的id,可与SYSOBJECTS.id相关联 SYSCOLUMNS.colid 列id,表示该列是表或视图的第几列 SYSCOLUMNS.type 物理存储类型,可与SYSTYPES.type相关联. SYSCOLUMNS.length 数据的物理长度。 SYSCOLUMNS.name 列名字,即字段名。 SYSCOLUMNS.Pre 列的精度级。 SYSCOLUMNS.Scale 列的标度级。 表SYSTYPES为每个系统和每个用户提供的数据类型创建一条记录,如果它们存在,给定域和默认值,描述系统提供的数据类型的行不可更改。 该表相关字段的含义如下: SYSTYPES.name 数据类型的名字。 SYSTYPES.type 物理存储数据类型。 在SQL SERVER的企业管理器(SQL ENTERPRISE MANAGER)中,选定某一数据库,创建存储过程print_dbstructure。 源代码如下: if exists (select* from sysobjects where id=object_id( 'dbo.print_dbstructure ')and sysstat & 0xf=4)存储过程 drop procedure dbo. print_dbstructure GO CREATE PROCEDURE print_dbstructure AS SELECT DISTINCT sysobjects.name, syscolumns.colid, syscolumns.name, systypes.name, syscolumns.prec, syscolumns.scale FROM syscolumns, sysobjects, systypes WHERE sysobjects.id=syscolumns.id AND systypes.type=syscolumns.type AND ((sysobjects. type= 'u ')) GO 首先判断是否存在一个名为print_dbstructure的存储过程,如果存在,就摘除它,否则,定义SQL语句建立新的存储过程。从三个系统表中选出满足条件的记录(即该数据库中保存在系统表中的用户表信息)。 执行时,在ISQL_W工具中,选定print_dbstructure所在的数据库,执行该存储过程,即可得到结果集(即该数据库中用户表的结构信息)。 3. SQL Server系统表的应用推广 以上所介绍存储过程的主要缺陷在于只能对服务器上某一特定的数据库(print_dbstructure所在的数据库)进行查询操作,我们可以通过在SQL Server系统数据库MASTER中建立带有数据库名参数的系统存储过程来解决这一问题,请读者自行完成。当然,SQL Server 系统表的应用远不止于止,读者也可依本文所介绍的方法去挖掘其他几个系统表的应用。 /*创建bbsDB数据库*/ use master if exists(select * from sysdatabases where name='bbsDB') drop database bbsDB create database bbsDB on ( name='bbsDB_data', filename='D:\project\bbsDB_data.mdf', size=10, filegrowth=20% ) log on ( name='bbsDB_log', filename='D:\project\bbsDB_log.ldf', size=3, maxsize=20, filegrowth=10% ) /*创建bbsUsers表*/ use bbsdb if exists(select * from sysobjects where name='bbsUsers') drop table bbsUsers create table bbsUsers ( UID int identity(1,1) not null,--学号,标识列 Uname varchar(15) not null,--用户昵称 Upassword varchar(10) not null,--用户密码 Uemail varchar(20),--邮箱地址 Usex bit not null,--用户性别 Uclass int,--等级 Uremark varchar(20),--备注 UregDate datetime not null,--注册日期 Ustate int null, --状态 Upoint int null--用户积分 ) /*创建bbsUsers表中的约束*/ alter table bbsUsers add constraint PK_uid primary key(uid),--主键 constraint DF_Upassword default(888888) for Upassword,--初始密码为888888 constraint DF_Usex default (1) for Usex,--性别默认为男 constraint DF_UregDate default (getdate()) for UregDate,--注册日期默认为系统日期 constraint DF_Ustate default(0) for Ustate,--状态默认为离线 constraint DF_Upoint default(20) for Upoint,--积分默认为20点 constraint CK_Uemail check(Uemail like '%@%'),--电子邮件必须含有@符号 constraint CK_Upassword check (len(Upassword)>=6)--密码至少为六位 /*创建bbsSection表*/ use bbsdb if exists(select * from sysobjects where name='bbsSection') drop table bbsSection create table bbsSection ( SID int identity(1,1) not null,--板块标号,自动增长 Sname varchar(32) not null,--版块名称 SmasterID int not null,--版主用户ID Sprofile varchar(20) null,--版面简介 SclickCount int null, --点击率 StopicCount int null--发帖数 ) /*创建bbsSection表中的约束*/ alter table bbsSection add constraint PK_sid primary key(sid),--主键 constraint DF_SclickCount default(0) for SclickCount,--点击率默认为0 constraint DF_StopicCount default(0) for StopicCount,--发帖数默认为0 constraint DF_SmasterID foreign key(SmasterID)references bbsUsers (UID)--外键 /*创建bbsTopic表*/ use bbsdb if exists(select * from sysobjects where name='bbsTopic') drop table bbsTopic create table bbsTopic ( TID int identity(1,1) not null,--帖子编号,自动增长 TsID int not null,--发帖人ID TuID int not null,--版主用户ID TreplyCount int null,--回复数量 Tface int null, --发帖表情 Ttopic varchar(20) not null,--标题 Tcontents varchar(30) not null,--正文 Ttime datetime null,--发帖时间 TclickCount int null,--点击数 Tstate int not null,--状态 TlastReply datetime null--回复时间 ) /*创建bbsTopic表的约束*/ alter table bbsTopic add constraint DF_TreplyCount default(0) for TreplyCount,--回复数量默认为0 constraint PK_tid primary key(tid),--主键 constraint DF_TclickCount default (0) for TclickCount,--点击数默认为0 constraint DF_Tstate default (1) for Tstate,--状态默认为1 constraint DF_Ttime default (getdate()) for Ttime,--发帖时间默认为系统日期 constraint CK_Tcontents check (len(Tcontents)>=6),--正文必须大于六个字符 constraint CK_TlastReply check ((TlastReply)>(Ttime)),--最后回复时间必须晚于发帖时间 constraint DF_TsID foreign key(TsID)references bbsSection (SID),--外键 constraint DF_TuID foreign key(TuID)references bbsUsers (UID)--外键 /*创建bbsReply表*/ use bbsdb if exists(select * from sysobjects where name='bbsReply') drop table bbsReply create table bbsReply ( RID int identity(1,1) not null,--自动编号,帖子编号 RtID int not null,--主贴ID RsID int not null,--板块ID RuID int not null,--回帖人ID Rface int null, --回帖表情 Rcontents varchar(30) not null,--正文 Rtime datetime null,--回帖时间 RclickCount int null--点击数 ) /*创建bbsReply表的约束*/ alter table bbsReply add constraint DF_Rtime default (getdate()) for Rtime,--回帖时间默认为系统日期 constraint CK_Rcontents check (len(Rcontents)>=6),--正文必须大于六个字符 constraint DF_RtID foreign key(RtID)references bbsTopic (TID),--外键 constraint DF_RsID foreign key(RsID)references bbsSection (SID),--外键 constraint DF_RuID foreign key(RuID)references bbsUsers (UID)--外键