Sql server SQL Server表中的第二个计数器
我需要一张这样的桌子:Sql server SQL Server表中的第二个计数器,sql-server,counter,Sql Server,Counter,我需要一张这样的桌子: CLIENT_ID ID CONTENT -------------------- 1 1 abc 1 2 abc 1 3 abc 2 1 abc 2 2 abc 2 3 abc client_id和id是表的主键。在应用程序端,只知道客户端client\u id和content,所以我想有一个插入后触发器,根据需要更新id列,但我遇到了麻烦。有什么帮助吗?谢谢
CLIENT_ID ID CONTENT
--------------------
1 1 abc
1 2 abc
1 3 abc
2 1 abc
2 2 abc
2 3 abc
client_id
和id
是表的主键。在应用程序端,只知道客户端client\u id
和content
,所以我想有一个插入后触发器,根据需要更新id
列,但我遇到了麻烦。有什么帮助吗?谢谢
我的第一次尝试是:
CREATE TRIGGER test
ON [dbo].[table]
AFTER INSERT
AS
BEGIN
DECLARE @client_id INT;
DECLARE @id INT;
SELECT @client_id = client_id
FROM inserted;
SELECT @id = ISNULL(MAX(clifor_id), 0) + 1
FROM table
WHERE client_id = @client_id
UPDATE [dbo].[table]
SET [id] = @id
WHERE ?????
END
但我不知道如何完成它
ps:对不起我的英语 @Squirrel为你指出了一个好的方向-而不是触发器是一种方法。S.t.像这样:
CREATE TRIGGER test
ON [dbo].[table]
INSTEAD OF INSERT
AS
BEGIN
UPDATE inserted
SET id = (select 1+max(id) from dbo.table where client_id = inserted.client_id)
INSERT INTO dbo.table
SELECT * FROM inserted --note - you should rewrite this block so it will be with explicit list of columns
END
请注意,如果您可以在一个查询中为同一客户机插入多个条目,则此操作将失败。触发什么事件?“第二个计数器”与您显示的表有什么关系?请重新考虑你的问题,因为你问的不是很清楚。请看一些提示,因为你说你正在尝试,你所尝试的代码是什么,你得到了什么错误?你需要使用<代码>而不是< /代码>触发器,而不是<>代码> 触发器。如果您不提供
id
列,则插入将失败。您的触发器有一个主要缺陷,您似乎认为它每行调用一次,但事实并非如此。触发器将对每条语句触发一次,因此,如果导致此触发器触发的INSERT
插入了25行,则触发器将触发一次,而Inserted
伪表将包含25行。您的代码将从插入的中选择这25行中的哪一行?这是不确定的,您将得到一个任意行,而忽略所有其他行。你需要重写你的触发器来考虑这一点!