Sql server 在一个表中只接受N个相同Id的数字

Sql server 在一个表中只接受N个相同Id的数字,sql-server,Sql Server,我有以下表格: 表1 表2 我想做的是只接受表2中总共3个Id相同的寄存器,就像上面的例子一样,如果我尝试注册另一个Id为1的行,那么一定会发生错误,或者在Sql Server中可以这样做,或者我需要在Sql js、php、c等外部处理这个问题 换句话说,我希望我的表1总共只接受3行相同的IdProduct,也许我必须用触发器试试?在SQL Server存储过程中,使用if、else?的存储过程可以简单地实现以下功能: CREATE PROCEDURE [dbo].[proc_InsertPro

我有以下表格:

表1

表2

我想做的是只接受表2中总共3个Id相同的寄存器,就像上面的例子一样,如果我尝试注册另一个Id为1的行,那么一定会发生错误,或者在Sql Server中可以这样做,或者我需要在Sql js、php、c等外部处理这个问题


换句话说,我希望我的表1总共只接受3行相同的IdProduct,也许我必须用触发器试试?在SQL Server存储过程中,使用if、else?

的存储过程可以简单地实现以下功能:

CREATE PROCEDURE [dbo].[proc_InsertProduct]
(   @ProductId   INT, @Price DECIMAL (9,2)   ) 
AS
BEGIN

    DECLARE @ProductCount AS INT = 0
    SELECT @ProductCount = COUNT(*) FROM Table2 WHERE IDProduct = @ProductId   

   IF @ProductCount < 3
       INSERT INTO Table1 (IDProduct, Price) VALUES (@ProductId, @Price)
   ELSE
      -- You can RAISEERROR or some other way to notify the insert is not happen

END

在SQL Server存储过程中,您可以简单地实现以下目标:

CREATE PROCEDURE [dbo].[proc_InsertProduct]
(   @ProductId   INT, @Price DECIMAL (9,2)   ) 
AS
BEGIN

    DECLARE @ProductCount AS INT = 0
    SELECT @ProductCount = COUNT(*) FROM Table2 WHERE IDProduct = @ProductId   

   IF @ProductCount < 3
       INSERT INTO Table1 (IDProduct, Price) VALUES (@ProductId, @Price)
   ELSE
      -- You can RAISEERROR or some other way to notify the insert is not happen

END
使用带有用户定义函数的检查约束可以解决此问题

首先创建UDF dbo.CheckIDProduct以从表2中获取IDProduct的计数

之后,在表2上添加检查约束

使用带有用户定义函数的检查约束可以解决此问题

首先创建UDF dbo.CheckIDProduct以从表2中获取IDProduct的计数

之后,在表2上添加检查约束


根据,使用触发器。这是可以做到的,但我仍然不推荐这种技术。我还想说,这应该在应用程序的业务层中完成。触发器将是最佳选择。您可以在表上添加检查约束。根据,使用触发器。可以做到,但我还是不推荐这种技术。我还想说,这应该在应用程序的业务层中完成。触发器将是最佳选择。您可以在表上添加检查约束。这可能会起作用,但您希望在显式事务中对其进行更好的保护,如果您正在构建一个一次必须支持多个用户的系统,则在选择期间进行独占锁定。否则,这里有一个明显的竞争,两个会话执行一个计数,两个会话都观察到计数小于3,然后两个会话都插入并使计数大于3。这可能会起作用,但您希望对其进行更好的保护,如果您正在构建一个一次必须支持多个用户的系统,则在选择期间进行独占锁定。否则这里有一个明显的竞争,两个会话执行一个计数,两个会话都观察到计数小于3,然后都插入并将计数取到3以上。
CREATE PROCEDURE [dbo].[proc_InsertProduct]
(   @ProductId   INT, @Price DECIMAL (9,2)   ) 
AS
BEGIN

    DECLARE @ProductCount AS INT = 0
    SELECT @ProductCount = COUNT(*) FROM Table2 WHERE IDProduct = @ProductId   

   IF @ProductCount < 3
       INSERT INTO Table1 (IDProduct, Price) VALUES (@ProductId, @Price)
   ELSE
      -- You can RAISEERROR or some other way to notify the insert is not happen

END
ALTER TABLE Table_2
  ADD CONSTRAINT chkIDProductCount
  CHECK (dbo.CheckIDProduct(IDProduct) <= 2);