2013-04-21 67 views
1

我有一个表“用户”用的userid PK.I需要为FK内容添加到多个现有的表2列。现在,我正在更新每张表的foll。办法。添加外键到多个现有的表

alter table table1 
add foreign key(createdby) references users(id) 
go 
alter table table1 
add foreign key(createdby) references users(id) 
go 

是否有更简单的方法来一次更新所有表格。谢谢。

+0

如果您正在使用的应用程序一样的ColdFusion,.NET等,这些应用程序通过表名的列表,有必要permisions,你可以循环。 – 2013-04-21 13:56:50

+0

嗨。我正在使用sql server 2008 r2。我可以得到TBL名称:“选择INFORMATION_SCHEMA.COLUMNS表名,其中列名=‘createdby’和TABLE_CATALOG =‘dbtables’......但我不知道汉王着手进一步 – Ruby 2013-04-21 13:58:57

+0

没有,有没有做这个简单的方法 - 如果你想外键添加到10个表,你需要写10'ALTER TABLE'命令 – 2013-04-21 13:59:39

回答

1

maby这样的事情会做的伎俩!

DECLARE @TableName AS NVARCHAR(128) 
DECLARE @Schema AS NVARCHAR(128) 
DECLARE @Modify AS INTEGER 
DECLARE @Created AS INTEGER 
DECLARE @sql1 as nvarchar(max) 
DECLARE @sql2 as nvarchar(max) 
DECLARE curs CURSOR FOR 
SELECT 
A.[name], 
S.[name] as schemaname, 
(SELECT 1 FROM sys.all_objects innero 
where innero.[name] = 'FK_ModifiedBy' 
AND innero.parent_object_id = a.[object_id]) as ModifiedBy, 
(SELECT 1 FROM sys.all_objects innero 
where innero.[name] = 'FK_CreatedBy' 
AND innero.parent_object_id = a.[object_id]) as CreatedBy 
FROM 
    sys.all_objects A 
INNER JOIN 
sys.all_columns O ON 
A.[object_id] = O.[object_id] 
INNER JOIN 
SYS.schemas S ON 
A.[schema_id] = S.[schema_id] 
WHERE 
O.name = 'ModifiedBy' 
OPEN curs 
FETCH NEXT FROM curs 
INTO @TableName, @Schema, @Modify, @Created 
WHILE @@FETCH_STATUS = 0 
BEGIN 
IF @Modify IS NULL 
BEGIN 
set @sql1 = N'ALTER TABLE ' + @Schema + '.' + @TableName 
+ ' ADD CONSTRAINT FK_ModifiedBy FOREIGN KEY (ModifiedBy) 
REFERENCES ' + @Schema + '.Users(userid)' 
exec SP_EXECUTESQL @sql1 
END 
IF @Created IS NULL 
BEGIN 
set @sql2 = N'ALTER TABLE ' + @Schema + '.' + @TableName 
+ ' ADD CONSTRAINT FK_CreatedBy FOREIGN KEY (createdby) 
REFERENCES ' + @Schema + '.Users(userid)' 
exec SP_EXECUTESQL @sql2 
END 
FETCH NEXT FROM curs 
INTO @TableName, @Schema, @Modify, @Created 
END 
CLOSE curs 
DEALLOCATE curs 



对不起,在SQL建立不好缩进,似乎有点繁琐,使其在这里好。如果某些表只有另外两列中的一列,这可能需要稍微调整。

+0

我们都有自己的喜好和矿是水平滚动的消除比缩进更重要。 – 2013-04-21 15:27:27

+0

@克里斯特@ Dan.Thank你很much.It工作 – Ruby 2013-04-21 19:03:51

1

这对于具有不同的语法另一个数据库和不同的DDL变化但结构是一样的。声明:查询数据字典表,并返回你想在执行每条语句运行,然后打开并循环通过游标的SQL语句的光标。

DECLARE SQLStr SHORTSTRING(1000); 
DECLARE NoDefaultsCursor CURSOR FOR 
    SELECT 'ALTER TABLE "' || TABLE_NAME || 
      '" ALTER COLUMN "' || FIELD_NAME || '" SET DEFAULT ' || 
    CASE FIELD_TYPE_SQL 
     WHEN 'INTEGER' THEN '0' 
     WHEN 'BOOLEAN' THEN 'FALSE' 
     WHEN 'SHORTSTRING' THEN '''''' 
     WHEN 'CHARACTER VARYING' THEN '''''' 
    END || ';' AS AddDefaultSQL 
    FROM #FIELDS WHERE NOT FIELD_HASDEFAULT 
    AND FIELD_TYPE_SQL IN 
     ('INTEGER','BOOLEAN','SHORTSTRING','CHARACTER VARYING'); 
OPEN NoDefaultsCursor; 
FETCH NEXT FROM NoDefaultsCursor INTO SQLStr; 
WHILE @@FETCH_STATUS = 0 DO 
    Execute Immediate SQLStr; 
    FETCH NEXT FROM NoDefaultsCursor INTO SQLStr; 
END WHILE; 
CLOSE NoDefaultsCursor; 
0

我也试过christer.This的压缩版本工作太。想到可能会帮上别人

declare @tblname nvarchar(50),@sql1 nvarchar(max),@sql2 nvarchar(max) 
declare curs cursor for 
select TABLE_NAME from INFORMATION_SCHEMA.COLUMNS where COLUMN_NAME ='createdby' 
open curs 
fetch next from curs into @tblname 
while @@FETCH_STATUS=0 
    begin 
    set @sql1='alter table dbo.'+ @tblname+ 
    ' add foreign key(createdby) references users(id)' 
    exec sp_executesql @sql1 
    set @sql2='alter table dbo.'[email protected]+ 
    ' add foreign key(modifiedby) references users(id)' 
    exec sp_executesql @sql2 
    fetch next from curs into @tblname 
    end 
close curs 
deallocate curs 
+0

这是可行的,但你不能运行multible倍,相信的时候你会得到错误,然后。另外,如果你有多元模式的话,你也必须包含它。好东西,它为你工作! :) – 2013-04-21 21:34:47

+0

是的,你是对的 – Ruby 2013-04-22 08:58:11