2012-08-07 71 views
0

與SQL Server 2008玩周圍,我有一個表People的列:SQL Server - 如果在其他表中存在更改列?

Name | City | Born | ... 

和另一個表Change的列:

OldName | NewName 

現在我想在表People事情來改變Name像這樣:如果表Change中的OldNameName中的People相同,則將Name更改爲PeopleNewNameChange

任何簡單的方法?

哦,另一個問題:如果在PeopleName將是主鍵(或讓說NameCity將複合鍵),那會是更難改名字? THX

+1

如果'Name'是主鍵的一部分,它默認是集羣鍵(物理排序的鍵)的一部分。更改該值將導致表結構發生更改,這將要求重建該表上的所有非聚集索引.... **不是**一個好主意!那麼引用該主鍵的所有子表又如何呢?你如何更新這些?主鍵一旦定義,最好保持不變。 – 2012-08-08 05:11:45

+0

因此,如果Person是主鍵,那麼無法解決這個問題? – miri 2012-08-08 07:28:11

+0

有辦法解決它 - 但沒有一個是非常簡單和容易做.....我會盡力避免這個不惜一切代價 – 2012-08-08 07:43:48

回答

1

正確答案爲)

UPDATE people,change 
SET people.name = change.newname 
WHERE people.name = change.oldName 

編輯與INNER JOIN語法:

UPDATE people 
SET people.name = change.newName 
FROM people 
INNER JOIN change ON people.name = change.oldName 

我沒有一個SQL Server來測試,但根據網上的例子,它應該工作。

/編輯

ANSWER2)只要你仍保持在關鍵的獨特性也不會很難做任何改動。一旦你發生碰撞,你會得到一個錯誤。由於這個原因,最好的辦法是在人自動遞增的ID字段,這將是你的PK

+0

關於#2:真的嗎?!?!?那麼引用你即將改變的主鍵的子表會發生什麼?更改主鍵是**從來不是一個好主意..... – 2012-08-08 05:10:08

+0

people,change =語法錯誤。不知何故,它不是那麼容易與MS SQL服務器做到這一點。我需要INNER JOIN和ON ... – miri 2012-08-08 08:12:46

+1

@marc - 我完全同意PK不應該改變,但問題不是「應該」它是「會很難」 – invertedSpear 2012-08-08 16:52:58

1

你可能會更好的PeopleId列在Change表添加到People表,並更換OldName列與具有外鍵關係回到PeoplePeopleId列:

人:

PeopleId | Name | City  | Born 
------------------------------------------- 
1  | Fred | New York | 1/1/1980 
2  | Wilma | Boston | 1/1/1980 

變化:

PeopleId | NewName 
---------------------- 
1  | Barney 
相關問題