2013-04-21 7 views
1

userid가 PK 인 테이블 'user'가 있습니다.이 테이블을 여러 기존 테이블의 2 개 열에 FK로 추가해야합니다. 지금은 각 테이블을 업데이트하고 있습니다. 방법.기존의 여러 테이블에 외래 키를 추가합니다.

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 등의 응용 프로그램을 사용하고 해당 응용 프로그램에 필요한 permuation이있는 경우 테이블 이름 목록을 반복 할 수 있습니다. –

+0

안녕하세요. SQL Server 2008 r2를 사용하고 있습니다. 나는 tbl 이름을 얻을 수있다 : "column_name = 'createdby'와 table_catalog = 'dbtables'....를 information_schema.columns에서 table_name을 선택한다. 그러나 더 진행하려면 hw를 모른다. – Ruby

+0

아니,이 작업을 수행하는 간단한 방법이 없다. - 10 개의 테이블에 외래 키를 추가하려면 10 개의 ALTER TABLE 명령을 사용해야합니다. –

답변

1

maby 이런 식으로 마술을 할 것입니다! 는 SQL 구축에 좋지 들여 쓰기 죄송

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 



, 여기가 좋은 수 있도록 조금 성가신 것 같다. 일부 테이블에 다른 두 열 중 하나만있는 경우에는 약간의 조정이 필요합니다.

+0

우리 모두는 우리 자신의 취향을 가지고 있으며, 수평 스크롤의 제거가 들여 쓰기보다 훨씬 더 중요하다는 사실을 알게되었습니다. –

+0

@ Christer. @ Dan. 대단히 감사합니다. 작동했습니다. – Ruby

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의 압축 버전을 시도했다. 이것 역시 효과가있다. 생각이 다른 사람에게 도움이 될 수 있습니다

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

이 작업은 가능하지만 여러 번 실행할 수는 없습니다. 오류가 발생하면 믿을 수 있습니다. 또한 다중 스키마가있는 경우이를 포함해야합니다. 그것이 당신을 위해 일한 좋은 일! :) –

+0

네가 맞아. – Ruby

관련 문제