我有一张表格,其中包含有关玩家的所有信息。我想要做的是获取此信息并将数据拆分到不同的表中。例如:
Table PlayerData拥有所有信息。表格Address
包含有关玩家住所的信息,表Info
包含姓名,出生日期和地址ID(指向Address
表)等信息。
我可以使用INSERT INTO...SELECT
来复制数据。但是,我的问题在于按顺序执行此操作,以便将从Address表输出的正确ID插入到Info表中,否则会在哪个地址属于哪个播放器之间混淆。如何获取为地址插入创建的标识并在随后的人员插入中使用该标识?
速度不是优先级,因为这只是初始化数据库一次,完整性至关重要。
由于
答案 0 :(得分: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;
答案 1 :(得分: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表。请注意,它拥有自己的身份字段,但也有一个引用PlayerNum表的PlayerID;
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,以便检索您的数据。
由于我们正在使用外键,因此您无法在没有PlayerNum中的相应条目的情况下让拥有AddressData或PlayerPersonalInfo信息的玩家