插入...选择 - 获取并使用自动增量ID

时间:2016-06-08 11:39:37

标签: sql sql-server tsql stored-procedures triggers

我有一张表格,其中包含有关玩家的所有信息。我想要做的是获取此信息并将数据拆分到不同的表中。例如:

Table PlayerData拥有所有信息。表格Address包含有关玩家住所的信息,表Info包含姓名,出生日期和地址ID(指向Address表)等信息。

我可以使用INSERT INTO...SELECT来复制数据。但是,我的问题在于按顺序执行此操作,以便将从Address表输出的正确ID插入到Info表中,否则会在哪个地址属于哪个播放器之间混淆。如何获取为地址插入创建的标识并在随后的人员插入中使用该标识?

速度不是优先级,因为这只是初始化数据库一次,完整性至关重要。

由于

2 个答案:

答案 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信息的玩家