在考虑高并发的情况下,主键id往往是放在一个单独的表里管理的,这个表里存着所有的表名和其最大id
新增时,刷新这个表里的最大值,并取回。
存储过程脚本
USE [YourDB]
GO
/****** Object: StoredProcedure [dbo].[UP_BillID] Script Date: 2020-06-21 21:30:18 ******/
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
ALTER PROCEDURE [dbo].[UP_BillID] -- 易宝单据最大值自动获取与更新用法
@UpTableName VARCHAR(30), -- 表名
@ReturnID int OUTPUT -- 返回的主健值
AS
BEGIN
set nocount on
IF EXISTS(SELECT 1 FROM SYSStream WHERE TableName=@UpTableName)
BEGIN
SELECT @ReturnID = MAXID FROM SYSStream WHERE TABLENAME = @UpTableName
UPDATE SYSStream SET MAXID = @ReturnID + 1 WHERE TABLENAME = @UpTableName --主表占用更新最大健值ID
END
ELSE
BEGIN
SET @ReturnID=1
INSERT INTO SYSStream(TableName, MaxID) VALUES(@UpTableName,2) --此处为2
END
END
php脚本:
$t_table_name = 'YourTableName';
$M = M('','', 'yibao_25');
$sql = "DECLARE @ID INT
EXEC dbo.UP_BillID '{$t_table_name}', @ID OUTPUT
SELECT @ID AS BILL_ID";
$d = $M->query($sql);
$BILL_ID = $d[0]['BILL_ID'];
如果执行存储过程报这个错:
The active result for the query contains no fields.
加上一行 set nocount on 就可以了