我的SQL
服务器GamerName
和GamerValues
上有两张桌子,我想{I} insert
GamerName
}
GamerName
╔════╦═════════╦
║ ID ║ Name ║
╠════╬═════════╬
║ 1 ║ Jeff ║
║ 2 ║ Geoff ║
║ 3 ║ Jarrod ║
║ 4 ║ Joel Sp ║
╚════╩═════════╩
因此,使用表inserted
上的最后一个GamerName
ID,值应填入GamerValues
GamerValues
╔════╦══════════════╦════════╗
║ ID ║ GamerID ║ Score ║
╠════╬══════════════╬════════╣
║ 1 ║ 1 ║ 5636 ║
║ 2 ║ 2 ║ 148 ║
║ 3 ║ 3 ║ 101 ║
║ 4 ║ 4 ║ 959 ║
╚════╩══════════════╩════════╝
是否可以使用单个查询执行此操作?
答案 0 :(得分:2)
您应该使用存储过程来管理它。您可以通过这种方式集中创建新游戏玩家所需的任何其他逻辑(例如,检查是否已存在)。
CREATE PROCEDURE dbo.CreateGamer
@Name VARCHAR(100)
AS
BEGIN
IF EXISTS (SELECT 'gamer name already exists' FROM GamerName AS G WHERE G.Name = @Name)
BEGIN
RAISERROR('Gamer name already used!', 16, 1)
RETURN
END
INSERT INTO GamerName (
Name)
VALUES
(@Name)
DECLARE @GamerID INT = SCOPE_IDENTITY()
INSERT INTO GamerValues (
GamerID,
Score)
SELECT
GamerID = @GamerID,
Score = 0
END
您可以使用UNIQUE
约束确保游戏玩家名称的唯一性,我只是使用EXISTS
来说明如何在SP中添加其他逻辑。
答案 1 :(得分:2)
您不需要触发器或任何@@IDENTITY
,SCOPE_IDENTITY()
功能。所有这些都有限制,它们都不能处理IDENTITY
约束不会产生的值。他们都不能处理多次插入。
您可以使用INSERT
的{{3}}子句将新插入的值复制到另一个表或表变量中。
OUTPUT也可用于UPDATE和DELETE。您可以使用inserted.
和deleted.
前缀
对于这些表:
create table #GamerName
(
ID int IDENTITY primary key,
Name nvarchar(20) not null
);
create table #GamerValues(
ID int IDENTITY primary key,
GamerID int not null,
Score int not null
);
您可以在#GamerName
中插入新记录,并将生成的ID复制到#GamerValues
,其中包含:
INSERT INTO #GamerName (Name)
OUTPUT inserted.ID,0 into #GamerValues(GamerID,Score)
VALUES
('Jeff'),
('Geoff'),
('Jarrod'),
新值显示在inserted
虚拟表中。 OUTPUT也可用
将为GamerValues中的每个玩家创建一个新线。让我们修改默认分数:
UPDATE #GamerValues
SET Score=100
该表格如下:
ID GamerID Score
1 1 100
2 2 100
3 3 100
使用
添加其他玩家insert into #GamerName (Name)
output inserted.ID,0 into #GamerValues(GamerID,Score)
Values
('Joel sp')
将导致得分为0的新行
ID GamerID Score
1 1 100
2 2 100
3 3 100
4 4 0
答案 2 :(得分:0)
您必须为此添加触发器。
CREATE TRIGGER newTrigger ON GamerName
FOR INSERT
AS
INSERT INTO GamerValues
(GamerID)
SELECT
'ID'
FROM inserted
GO
Btw得分变量默认设置为0,因为创建新用户时没有值。除非你这样做。
希望这有帮助
答案 3 :(得分:0)
如果您在Gamername Table中有一个标识列,则可以使用
INSERT INTO GamerName (Name)VALUES
('Joel Sp');
INSERT INTO GamerValues (GamerID,Score)
SELECT SCOPE_IDENTITY() ,0 score;
如果您只需要插入最后一列并假设gamername表中的游戏者ID是顺序的,那么您只需使用
INSERT INTO GamerValues (GamerID,Score)
select max(id),0 score from gamername;
如果没有满足您的条件,那么 TRIGGER 是最佳选择