【SQL Server DBA】维护语句:删除并创建外键约束、获取建表语句

1、删除外键约束,建立外键约束

先建立3个表:

 

/*
drop table tb
drop table tb_b
drop table tb_c
*/

--建立3个关联的表
create table tb(id int primary key ,vv varchar(10))


create table tb_b(
idd int primary key,
id int foreign key references tb(id)
)

create table tb_c(
iddd int primary key,
idd int foreign key references tb_b(idd)
)
go

 


可以生成删除外键的语句,需要复制出来,然后放到再执行:

 

;WITH FK  --外键约束
AS
(
	SELECT
		SCH.name as foreign_schema_name,   --外键schema名
		FK.name as foreign_name,           --外键名
		FK.is_disabled ,                   --是否禁用
		
		FK.delete_referential_action_desc as delete_action,
		FK.update_referential_action_desc as update_action,
		
		FKC.constraint_column_id,		   --约束列的id
		FKC.parent_object_id,              --父对象的id
		FKC.parent_column_id,              --父对象列的id
		
		
		FKC.referenced_object_id,          --被引用的对象
		FKC.referenced_column_id           --被引用的对象中的列
	 FROM sys.foreign_keys FK
		INNER JOIN sys.foreign_key_columns FKC
			ON FK.object_id = FKC.constraint_object_id
		INNER JOIN sys.schemas SCH
			ON FK.schema_id = SCH.schema_id
),

TB   --表和列
AS
(
	SELECT 
		TB.object_id,
		SCH.name as schema_name,
		TB.name as table_name,
		C.column_id as column_id,
		C.name as column_name		
	FROM sys.tables TB WITH(NOLOCK)
		INNER JOIN sys.columns C WITH(NOLOCK)
			ON TB.object_id = C.object_id
		INNER JOIN sys.schemas SCH WITH(NOLOCK)
			ON TB.schema_id = SCH.schema_id
	WHERE TB.is_ms_shipped = 0  -- 此条件表示仅查询不是由内部 SQL Server 组件创建对象
)

SELECT
    'alter table ['+TBP.schema_name+'].['+TBP.table_name+
    '] drop constraint ['+FK.foreign_name+'];' as '删除外键的语句,复制出来后运行'
FROM FK
INNER JOIN TB TBP
		ON FK.parent_object_id = TBP.object_id
		   AND FK.parent_column_id = TBP.column_id
		   
INNER JOIN TB TBR
		ON FK.referenced_object_id = TBR.object_id
		   AND FK.referenced_column_id = TBR.column_id
/*
删除外键的语句,复制出来后运行
alter table [dbo].[tb_b] drop constraint [FK__tb_b__id__6754599E];
alter table [dbo].[tb_c] drop constraint [FK__tb_c__idd__6C190EBB];
*/


另外,删除主键后,插入数据,然后再建立外键:

 

 

;WITH FK  --外键约束
AS
(
	SELECT
		SCH.name as foreign_schema_name,   --外键schema名
		FK.name as foreign_name,           --外键名
		FK.is_disabled ,                   --是否禁用
		
		FK.delete_referential_action_desc as delete_action,
		FK.update_referential_action_desc as update_action,
		
		FKC.constraint_column_id,		   --约束列的id
		FKC.parent_object_id,              --父对象的id
		FKC.parent_column_id,              --父对象列的id
		
		
		FKC.referenced_object_id,          --被引用的对象
		FKC.referenced_column_id           --被引用的对象中的列
	 FROM sys.foreign_keys FK
		INNER JOIN sys.foreign_key_columns FKC
			ON FK.object_id = FKC.constraint_object_id
		INNER JOIN sys.schemas SCH
			ON FK.schema_id = SCH.schema_id
),

TB   --表和列
AS
(
	SELECT 
		TB.object_id,
		SCH.name as schema_name,
		TB.name as table_name,
		C.column_id as column_id,
		C.name as column_name		
	FROM sys.tables TB WITH(NOLOCK)
		INNER JOIN sys.columns C WITH(NOLOCK)
			ON TB.object_id = C.object_id
		INNER JOIN sys.schemas SCH WITH(NOLOCK)
			ON TB.schema_id = SCH.schema_id
	WHERE TB.is_ms_shipped = 0  -- 此条件表示仅查询不是由内部 SQL Server 组件创建对象
)

SELECT
    'alter table ['+TBP.schema_name+'].['+TBP.table_name+
    '] add constraint ['+FK.foreign_name+'] '+
    ' foreign key('+TBP.column_name+') references [' +
    TBR.schema_name +'].['+ TBR.table_name +']('+TBR.column_name+')'
    as '新建外键索引,复制然后在运行'
FROM FK
INNER JOIN TB TBP
		ON FK.parent_object_id = TBP.object_id
		   AND FK.parent_column_id = TBP.column_id
		   
INNER JOIN TB TBR
		ON FK.referenced_object_id = TBR.object_id
		   AND FK.referenced_column_id = TBR.column_id
/*
新建外键索引,复制然后在运行
alter table [dbo].[tb_c] add constraint [FK__tb_c__idd__0A9D95DB]  foreign key(idd) references [dbo].[tb_b](idd)
alter table [dbo].[tb_b] add constraint [FK__tb_b__id__05D8E0BE]  foreign key(id) references [dbo].[tb](id)
*/


另外,还有一个问题:原来两个表之间是有外键的,删除了外键导入数据后,导入的数据记录条数和原表也一致,发现子表有记录不属于主表的,那么原来的外键是怎么建立的?

 

 

create table tb(id int primary key ,vv varchar(10))

insert into tb
values(1,'aa') 
go
 
create table tb_b(
idd int primary key,
id int --foreign key references tb(id)
)

insert into tb_b
values(1,2)  --id不在主表中
go

--新增外键约束,不会报错,with nocheck对于之前已经存在的数据,不会进行检测
ALTER TABLE [dbo].[tb_b]  WITH noCHECK ADD FOREIGN KEY([id])
REFERENCES [dbo].[tb] ([id])
GO

 
--会报错 ,在建立上面的约束后,再次插入,就会报错了
insert into tb_b
values(2,2)  --id不在主表中

 

2、如何根据表名查询出创建该表的代码

 

--当用以下代码创建一个表后,如何根据表名查询出创建该表的代码(也就是以下代码)?
CREATE TABLE [dbo].[a1](
	[c2] [decimal](10, 2) NULL,
	[c3] [decimal](10, 3) NULL CONSTRAINT [DF_a1_c3]  DEFAULT ((0)),
	[re] [bigint] IDENTITY(1,1) NOT NULL,
 CONSTRAINT [PK_a1] PRIMARY KEY CLUSTERED 
(
	[re] ASC
)WITH (PAD_INDEX  = OFF, STATISTICS_NORECOMPUTE  = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS  = ON, ALLOW_PAGE_LOCKS  = ON) ON [PRIMARY]
) ON [PRIMARY]
go

 

declare @sql varchar(8000),@tablename varchar(100)
set @tablename ='a1'--这里输入表名
set @sql = 'create table ['+@tablename+'] 
(
'
select @sql = @sql + b.name + ' '+
       c.name+
       case when c.collation_name is not null then '('+
         case when b.max_length <>-1 then convert(varchar(100),b.max_length)
           else 'MAX'
         end +') '
        else ''
       end +
       case when b.is_identity = 1 then ' identity('+convert(varchar(100),IDENT_SEED(@tablename))+','+convert(varchar(100),IDENT_INCR(@tablename))+')' else '' end +
       case when d.definition is not null then ' default('+d.definition +')' else '' end +
       case when b.is_nullable = 0 then ' not null' else ' null' end +
       
',
'
from sys.objects a join sys.columns b
on a.object_id = b.object_id
join sys.types c
on b.system_type_id = c.system_type_id and b.user_type_id = c.user_type_id
left join sys.default_constraints d
on b.default_object_id = d.object_id
where a.name=@tablename
order by b.column_id
if exists(select * from sys.indexes where object_id =object_id(@tablename) and is_primary_key =1 )
begin
select @sql = @sql + 'CONSTRAINT ['+name+'] PRIMARY KEY '+type_desc+'
(
' from sys.indexes where object_id =object_id(@tablename) and is_primary_key =1
select @sql = @sql + b.name + case when a.is_descending_key =1 then ' DESC' else ' ASC' end +',
' from sys.index_columns a join sys.columns b
on a.object_id= b.object_id and a.column_id = b.column_id
where a.object_id =object_id(@tablename)
select @sql = left(@sql,len(@sql)-3)+'
)'
select @sql = @sql+'
) ON [PRIMARY] '
end
else
begin
select @sql = left(@sql,len(@sql)-1)+'
) ON [PRIMARY] '
end
print @sql

/*
create table [a1] 
(
c2 decimal null,
c3 decimal default(((0))) null,
re bigint identity(1,1) not null,
CONSTRAINT [PK_a1] PRIMARY KEY CLUSTERED
(
re ASC
)
) ON [PRIMARY] 

*/


 

转载于:https://www.cnblogs.com/momogua/p/8304537.html

USE [UFDATA_002_2004] GO /****** Object: Table [dbo].[JustInVouchs] Script Date: 06/12/2014 14:09:57 ******/ drop table JustInVouchs drop table IA_Subsidiary SET ANSI_NULLS ON GO SET QUOTED_IDENTIFIER ON GO SET ANSI_PADDING ON GO CREATE TABLE [dbo].[JustInVouchs]( [AutoID] [int] NOT NULL, [cJVCode] [varchar](30) NOT NULL, [CorID] [int] NULL, [cCorCode] [varchar](30) NULL, [cInvCode] [varchar](20) NOT NULL, [iJVPrice] [money] NULL, [cJVBatch] [varchar](20) NULL, [cObjCode] [varchar](12) NULL, [cFree1] [varchar](20) NULL, [cFree2] [varchar](20) NULL, [cDefine22] [nvarchar](60) NULL, [cDefine23] [nvarchar](60) NULL, [cDefine24] [nvarchar](60) NULL, [cDefine25] [nvarchar](60) NULL, [cDefine26] [float] NULL, [cDefine27] [float] NULL, [cItemCode] [varchar](20) NULL, [cItem_class] [varchar](10) NULL, [cName] [varchar](60) NULL, [cItemCName] [varchar](20) NULL, [iJustInsId] [int] NULL, [cBVencode] [varchar](20) NULL, [cFree3] [varchar](20) NULL, [iMassDate] [int] NULL, [dMadeDate] [datetime] NULL, [cInVouchCode] [varchar](30) NULL, [cFree4] [varchar](20) NULL, [cFree5] [varchar](20) NULL, [cFree6] [varchar](20) NULL, [cFree7] [varchar](20) NULL, [cFree8] [varchar](20) NULL, [cFree9] [varchar](20) NULL, [cFree10] [varchar](20) NULL, [cDefine28] [varchar](120) NULL, [cDefine29] [varchar](120) NULL, [cDefine30] [varchar](120) NULL, [cDefine31] [varchar](120) NULL, [cDefine32] [varchar](120) NULL, [cDefine33] [varchar](120) NULL, [cDefine34] [int] NULL, [cDefine35] [int] NULL, [cDefine36] [datetime] NULL, [cDefine37] [datetime] NULL, CONSTRAINT [aaaaaJustInVouchs_PK] PRIMARY KEY NONCLUSTERED ( [AutoID] ASC ) ON [PRIMARY] ) ON [PRIMARY] GO SET ANSI_PADDING OFF GO /****** Object: Table [dbo].[IA_Subsidiary] Script Date: 06/12/2014 14:09:57 ******/ SET ANSI_NULLS ON GO SET QUOTED_IDENTIFIER ON GO SET ANSI_PADDING ON GO CREATE TABLE [dbo].[IA_Subsidiary]( [AutoID] [int] IDENTITY(1,1) NOT NULL, [bRdFlag] [bit] NOT NULL, [cBusType] [varchar](8) NULL, [cBusCode] [varchar](30) NULL, [cVouCode] [varchar](30) NULL, [ID] [int] NULL, [ValueID] [int] NULL, [JustID] [int] NULL, [dVouDate] [datetime] NULL, [dKeepDate] [datetime] NULL, [iMonth] [tinyint] NOT NULL, [iPZID] [int] NULL, [iPZDate] [datetime] NULL, [cPZtype] [varchar](8) NULL, [cPZdigest] [varchar](60) NULL, [cInvHead] [varchar](15) NULL, [cDifHead] [varchar](15) NULL, [cOppHead] [varchar](15) NULL, [cVouType] [varchar](4) NULL, [cPTCode] [varchar](2) NULL, [cSTCode] [varchar](2) NULL, [cWhCode] [varchar](10) NULL, [cAccDep] [varchar](12) NULL, [cInvCode] [varchar](20) NOT NULL, [cRdCode] [varchar](5) NULL, [cVenCode] [varchar](20) NULL, [cCusCode] [varchar](20) NULL, [cOrderCode] [varchar](30) NULL, [cARVCode] [varchar](30) NULL, [cBillCode] [int] NULL, [cDLCode] [int] NULL, [cPSPCode] [varchar](12) NULL, [cProCode] [varchar](50) NULL, [cDepCode] [varchar](12) NULL, [cPersonCode] [varchar](8) NULL, [cHandler] [varchar](20) NULL, [iAInQuantity] [float] NULL, [iAOutQuantity] [float] NULL, [iInCost] [float] NULL, [iOutCost] [float] NULL, [iAInPrice] [money] NULL, [iAOutPrice] [money] NULL, [cBatchCode] [varchar](20) NULL, [iDebitDifCost] [money] NULL, [iCreditDifCost] [money] NULL, [cAccounter] [varchar](20) NULL, [cMaker] [varchar](20) NULL, [bFlag] [tinyint] NULL, [bMoneyFlag] [bit] NOT NULL, [bSale] [bit] NOT NULL, [cMemo] [varchar](60) NULL, [cDefine1] [varchar](20) NULL, [cDefine2] [varchar](20) NULL, [cDefine3] [varchar](20) NULL, [cDefine4] [datetime] NULL, [cDefine5] [int] NULL, [cDefine6] [datetime] NULL, [cDefine7] [float] NULL, [cDefine8] [varchar](4) NULL, [cDefine9] [varchar](8) NULL, [cDefine10] [varchar](60) NULL, [cFree1] [varchar](20) NULL, [cFree2] [varchar](20) NULL, [cPZID] [varchar](30) NULL, [cDefine22] [nvarchar](60) NULL, [cDefine23] [nvarchar](60) NULL, [cDefine24] [nvarchar](60) NULL, [cDefine25] [nvarchar](60) NULL, [cDefine26] [float] NULL, [cDefine27] [float] NULL, [cItem_class] [varchar](10) NULL, [cItemCode] [varchar](20) NULL, [cName] [varchar](60) NULL, [cItemCName] [varchar](20) NULL, [noJustQuantity] [userdecimal] NULL, [cFree3] [varchar](20) NULL, [cFree4] [varchar](20) NULL, [cFree5] [varchar](20) NULL, [cFree6] [varchar](20) NULL, [cFree7] [varchar](20) NULL, [cFree8] [varchar](20) NULL, [cFree9] [varchar](20) NULL, [cFree10] [varchar](20) NULL, [cDefine11] [varchar](120) NULL, [cDefine12] [varchar](120) NULL, [cDefine13] [varchar](120) NULL, [cDefine14] [varchar](120) NULL, [cDefine15] [int] NULL, [cDefine16] [float] NULL, [cDefine28] [varchar](120) NULL, [cDefine29] [varchar](120) NULL, [cDefine30] [varchar](120) NULL, [cDefine31] [varchar](120) NULL, [cDefine32] [varchar](120) NULL, [cDefine33] [varchar](120) NULL, [cDefine34] [int] NULL, [cDefine35] [int] NULL, [cDefine36] [datetime] NULL, [cDefine37] [datetime] NULL, [psvsid] [int] NULL, [cCXHDcode] [varchar](30) NULL, [cCXFScode] [varchar](20) NULL, CONSTRAINT [aaaaaIA_Subsidiary_PK] PRIMARY KEY NONCLUSTERED ( [AutoID] ASC ) ON [PRIMARY] ) ON [PRIMARY] GO SET ANSI_PADDING OFF GO /****** Object: Default [DF__ia_subsid__cDefi__11165497] Script Date: 06/12/2014 14:09:57 ******/ ALTER TABLE [dbo].[IA_Subsidiary] ADD CONSTRAINT [DF__ia_subsid__cDefi__11165497] DEFAULT (NULL) FOR [cDefine22] GO /****** Object: Default [DF__ia_subsid__cDefi__120A78D0] Script Date: 06/12/2014 14:09:57 ******/ ALTER TABLE [dbo].[IA_Subsidiary] ADD CONSTRAINT [DF__ia_subsid__cDefi__120A78D0] DEFAULT (NULL) FOR [cDefine23] GO /****** Object: Default [DF__ia_subsid__cDefi__12FE9D09] Script Date: 06/12/2014 14:09:57 ******/ ALTER TABLE [dbo].[IA_Subsidiary] ADD CONSTRAINT [DF__ia_subsid__cDefi__12FE9D09] DEFAULT (NULL) FOR [cDefine24] GO /****** Object: Default [DF__ia_subsid__cDefi__13F2C142] Script Date: 06/12/2014 14:09:57 ******/ ALTER TABLE [dbo].[IA_Subsidiary] ADD CONSTRAINT [DF__ia_subsid__cDefi__13F2C142] DEFAULT (NULL) FOR [cDefine25] GO /****** Object: Default [DF__ia_subsid__cDefi__14E6E57B] Script Date: 06/12/2014 14:09:57 ******/ ALTER TABLE [dbo].[IA_Subsidiary] ADD CONSTRAINT [DF__ia_subsid__cDefi__14E6E57B] DEFAULT (NULL) FOR [cDefine26] GO /****** Object: Default [DF__ia_subsid__cDefi__15DB09B4] Script Date: 06/12/2014 14:09:57 ******/ ALTER TABLE [dbo].[IA_Subsidiary] ADD CONSTRAINT [DF__ia_subsid__cDefi__15DB09B4] DEFAULT (NULL) FOR [cDefine27] GO /****** Object: Default [DF__JustInVou__cDefi__16CF2DED] Script Date: 06/12/2014 14:09:57 ******/ ALTER TABLE [dbo].[JustInVouchs] ADD CONSTRAINT [DF__JustInVou__cDefi__16CF2DED] DEFAULT (NULL) FOR [cDefine22] GO /****** Object: Default [DF__JustInVou__cDefi__17C35226] Script Date: 06/12/2014 14:09:57 ******/ ALTER TABLE [dbo].[JustInVouchs] ADD CONSTRAINT [DF__JustInVou__cDefi__17C35226] DEFAULT (NULL) FOR [cDefine23] GO /****** Object: Default [DF__JustInVou__cDefi__18B7765F] Script Date: 06/12/2014 14:09:57 ******/ ALTER TABLE [dbo].[JustInVouchs] ADD CONSTRAINT [DF__JustInVou__cDefi__18B7765F] DEFAULT (NULL) FOR [cDefine24] GO /****** Object: Default [DF__JustInVou__cDefi__19AB9A98] Script Date: 06/12/2014 14:09:57 ******/ ALTER TABLE [dbo].[JustInVouchs] ADD CONSTRAINT [DF__JustInVou__cDefi__19AB9A98] DEFAULT (NULL) FOR [cDefine25] GO /****** Object: Default [DF__JustInVou__cDefi__1A9FBED1] Script Date: 06/12/2014 14:09:57 ******/ ALTER TABLE [dbo].[JustInVouchs] ADD CONSTRAINT [DF__JustInVou__cDefi__1A9FBED1] DEFAULT (NULL) FOR [cDefine26] GO /****** Object: Default [DF__JustInVou__cDefi__1B93E30A] Script Date: 06/12/2014 14:09:57 ******/ ALTER TABLE [dbo].[JustInVouchs] ADD CONSTRAINT [DF__JustInVou__cDefi__1B93E30A] DEFAULT (NULL) FOR [cDefine27] GO /****** Object: ForeignKey [FK__IA_Subsid__cDepC__4F7F3212] Script Date: 06/12/2014 14:09:57 ******/ ALTER TABLE [dbo].[IA_Subsidiary] WITH CHECK ADD FOREIGN KEY([cDepCode]) REFERENCES [dbo].[Department] ([cDepCode]) GO /****** Object: ForeignKey [FK__IA_Subsid__cDepC__5073564B] Script Date: 06/12/2014 14:09:57 ******/ ALTER TABLE [dbo].[IA_Subsidiary] WITH CHECK ADD FOREIGN KEY([cDepCode]) REFERENCES [dbo].[Department] ([cDepCode]) GO /****** Object: ForeignKey [FK__IA_Subsid__cDepC__51677A84] Script Date: 06/12/2014 14:09:57 ******/ ALTER TABLE [dbo].[IA_Subsidiary] WITH CHECK ADD FOREIGN KEY([cDepCode]) REFERENCES [dbo].[Department] ([cDepCode]) GO /****** Object: ForeignKey [FK__IA_Subsid__cInvC__525B9EBD] Script Date: 06/12/2014 14:09:57 ******/ ALTER TABLE [dbo].[IA_Subsidiary] WITH CHECK ADD FOREIGN KEY([cInvCode]) REFERENCES [dbo].[Inventory] ([cInvCode]) GO /****** Object: ForeignKey [FK__IA_Subsid__cInvC__534FC2F6] Script Date: 06/12/2014 14:09:57 ******/ ALTER TABLE [dbo].[IA_Subsidiary] WITH CHECK ADD FOREIGN KEY([cInvCode]) REFERENCES [dbo].[Inventory] ([cInvCode]) GO /****** Object: ForeignKey [FK__IA_Subsid__cInvC__5443E72F] Script Date: 06/12/2014 14:09:57 ******/ ALTER TABLE [dbo].[IA_Subsidiary] WITH CHECK ADD FOREIGN KEY([cInvCode]) REFERENCES [dbo].[Inventory] ([cInvCode]) GO /****** Object: ForeignKey [FK__IA_Subsid__cWhCo__55380B68] Script Date: 06/12/2014 14:09:57 ******/ ALTER TABLE [dbo].[IA_Subsidiary] WITH CHECK ADD FOREIGN KEY([cWhCode]) REFERENCES [dbo].[Warehouse] ([cWhCode]) GO /****** Object: ForeignKey [FK__IA_Subsid__cWhCo__562C2FA1] Script Date: 06/12/2014 14:09:57 ******/ ALTER TABLE [dbo].[IA_Subsidiary] WITH CHECK ADD FOREIGN KEY([cWhCode]) REFERENCES [dbo].[Warehouse] ([cWhCode]) GO /****** Object: ForeignKey [FK__IA_Subsid__cWhCo__572053DA] Script Date: 06/12/2014 14:09:57 ******/ ALTER TABLE [dbo].[IA_Subsidiary] WITH CHECK ADD FOREIGN KEY([cWhCode]) REFERENCES [dbo].[Warehouse] ([cWhCode]) GO /****** Object: ForeignKey [FK__JustInVou__cInvC__58147813] Script Date: 06/12/2014 14:09:57 ******/ ALTER TABLE [dbo].[JustInVouchs] WITH CHECK ADD FOREIGN KEY([cInvCode]) REFERENCES [dbo].[Inventory] ([cInvCode]) GO
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值