2016-06-08 105 views
0

我有一張表,其中包含有關玩家的所有信息。我想要做的就是獲取這些信息並將數據分成不同的表格。例如:插入...選擇 - 獲取並使用自動增量ID

Table PlayerData包含所有信息。表Address保存關於玩家的住所的信息,表Info保存諸如姓名,出生日期和地址ID(指向Address表)的信息。

我可以使用INSERT INTO...SELECT跨數據複製。然而,我的問題是依次執行此操作,使得從地址表輸出的正確ID被插入到Info表中,否則將在哪個地址屬於哪個播放器之間混淆。我如何獲得爲地址插入創建的身份,並在隨後的職員插入中使用該身份?

速度並不是一個優先事項,因爲這只是一次初始化數據庫,所以完整性至關重要。

感謝

+0

相應的條目BTW'Info'是不是真的爲表一個好名字。它並沒有真正描述表格的內容。 –

+0

對不起,我已經改變了這個問題的表的名稱。真正的表名是不同的:) – TryNCode

回答

1

你真的應該使用外鍵引用主表。現在我保持這個簡單,但如果你能遵循這個,那麼你將能夠編輯它以滿足你的需求。

好的,我們來製作一些示例數據。這相當於你當前的表格;

CREATE TABLE PlayerData (PlayerID int, PlayerName varchar (20), DateOfBirth date, Address1 varchar(20), Address2 varchar(20)) 
INSERT INTO PlayerData (PlayerID, PlayerName, DateOfBirth, Address1, Address2) 
VALUES 
(1,'Mike Hunt','1980-01-01','Mike Street','Hunt Town') 
,(2,'Harry Dong','1970-02-02','Harry Street','Dong Town') 
,(3,'Hugh Gass','1960-03-03','Hugh Street','Gass Town') 
,(4,'Neil Down','1950-04-04','Neil Street','Down Town') 
,(5,'Seymore Butts','1940-05-05','Seymore Street','Butts Town') 

我要創建一個保存我的玩家ID號的唯一列表中的一個表,這是我會把不適合到其他表遠一點的信息。對於這個例子,我只有一個領域;

CREATE TABLE PlayerNum (PlayerID int PRIMARY KEY CLUSTERED) 

我現在要創建我的新AddressData表。注意它有它自己的標識字段,但也有一個PlayerID來引用PlayerNum表;

CREATE TABLE AddressData (AddressID int identity(10,1) PRIMARY KEY CLUSTERED, PlayerID int, Address1 varchar(20), Address2 varchar(20), FOREIGN KEY (PlayerID) REFERENCES PlayerNum(PlayerID)) 

我打算對包含我的玩家的個人信息的表做同樣的處理,

CREATE TABLE PlayerPersonalInfo (InfoID int identity(50,1) PRIMARY KEY CLUSTERED, PlayerID int, PlayerName varchar(20), DateOfBirth date, FOREIGN KEY (PlayerID) REFERENCES PlayerNum(PlayerID)) 

所以,現在我已經得到了我新的3個表是空的,一個表的數據插入到他們。我們首先填充我們的PlayerNum表,這需要首先是因爲其他表上的外鍵約束;

INSERT INTO PlayerNum (PlayerID) 
SELECT PlayerID 
FROM PlayerData 

現在我已經完成了,讓我們將數據插入到AddressData中。注意我沒有將數據插入到AddressID字段中,因爲它是一個標識字段。它將從10開始並按照表格定義遞增1;

INSERT INTO AddressData (PlayerID, Address1, Address2) 
SELECT PlayerID, Address1, Address2 
FROM PlayerData 

我打算對我的PlayerPersonalInfo數據做同樣的事情。該表格的身份將從50開始並增加1;

INSERT INTO PlayerPersonalInfo (PlayerID, PlayerName, DateOfBirth) 
SELECT PlayerID, PlayerName, DateOfBirth 
FROM PlayerData 

如果您確信不需要它,您現在可以擺脫PlayerData表。

DROP TABLE PlayerData 

你現在有3張表;

PlayerNum

PlayerID 
1 
2 
3 
4 
5 

AddressData

AddressID PlayerID Address1  Address2 
10   1   Mike Street  Hunt Town 
11   2   Harry Street Dong Town 
12   3   Hugh Street  Gass Town 
13   4   Neil Street  Down Town 
14   5   Seymore Street Butts Town 

PlayerPersonalInfo

InfoID PlayerID PlayerName  DateOfBirth 
50  1   Mike Hunt  1980-01-01 
51  2   Harry Dong  1970-02-02 
52  3   Hugh Gass  1960-03-03 
53  4   Neil Down  1950-04-04 
54  5   Seymore Butts 1940-05-05 

通知噸最後兩個表中的PlayerID現在可以鏈接到PlayerNum以檢索您的數據。

由於我們使用外鍵,你不能在AddressData或PlayerPersonalInfo信息的球員沒有PlayerNum

+0

很好的答案,謝謝!但是關於額外的PlayerID列,與簡單使用AddressData.AddressID作爲具有AddressID列的PlayerPersonalInfo表的PK和FK有什麼不同?因爲地址是唯一的,所以我一直使用AddressID作爲FK(和PK) – TryNCode

+0

這一切都取決於你需要存儲哪些其他信息。我通常會把玩家當作唯一的領域,這樣,如果他們搬家或者類似的話,你可以爲一個人設置多個地址(作爲例子)。它將允許您保留舊數據用於審計目的,並且只在您查找其當前地址時才加入最新數據。 –

+0

好吧,我明白了。我有一個審計表顯示所有的變化,但我明白你的意思是因爲它在一個地方。這需要對我進行相當多的重構(現有的存儲過程等),以實現 – TryNCode

3

如果你正在學習如何做到這一點,那麼學習的正確方法:在OUTPUT條款(記錄here)。

這允許您將結果放入一個臨時表(通常是一個表變量)。一個例子是:

DECLARE @ids TABLE (AddressId int); 

INSERT INTO ADDRESS(. . .) 
    OUTPUT inserted.AddressId INTO @ids 
    VALUES (. . .); 

INSERT INTO info(. . ., AddressId) 
    SELECT . . . , i.AddressId 
    FROM @ids i; 
+0

謝謝。我只是試過這個,但我得到了'違反主鍵約束'PK_Info'。不能在對象'dbo.Info'中插入重複鍵。重複的鍵值是(12).'看起來代碼是循環運行的,因爲表本身最初是空的 – TryNCode