这是我对其他问题的一种跟进:Delimited string of ids as a field or a separate table?
我有一个数据库,其中包含一个产品表,一个类别,一个类似“productsInCategories”(在另一个问题中描述)。 productsInCategories-table有两个字段:productId和categoryId。
当我想从类别中获取所有产品时,我会做类似的事情:
SELECT *
FROM Products
INNER JOIN ProductsInCategories
ON Products.Id=ProductsInCategories.productId
它运作良好,我认为这是正确的方法吗?
无论如何,我不确定如何以最佳方式插入新产品。 客户端发送新产品的属性,以及应添加到的类别的ID。服务器在Products-table上执行INSERT查询,还在ProductsInCategories上执行一个INSERT查询,其中它插入客户指定的新创建的产品和category-id的id。 这个问题是用户当然可以发送自定义数据,并指定不属于他的类别。
我应该首先执行SELECT并获取用户指定的类别的userID,并检查它是否与当前用户的id匹配?或者ProductsInCategories是否还包含userId的字段(似乎多余?)?或者最好是,有没有办法在SELECT查询中验证这一点?
答案 0 :(得分:1)
我找到了一种在insert-query中添加一种条件的方法。这是如何:
INSERT INTO productsInCategories (categoryId, productId)
SELECT id,@0 FROM Categories WHERE userId=@1 AND id=@2
@0=Last insert id (the product inserted prior to this query)
@1=The user id
@2=The category id supplied by the client
如果客户端提供了一个spooked category-id,那么select语句将找不到任何记录(除非该类别归同一个用户所有,如果我们不关心),并且不会插入任何内容。然后我们只检查插入了多少行(我使用的WebMatrix.Data.Database的执行函数返回受影响的记录计数为int然后为0)如果没有则返回。
嵌套SELECT的INSERT看起来很有趣,至少对我而言。没有“Values()”,第二个不相关的参数位于其中间。我没有真正查找任何有关它的事情,并且没有任何事实,但我认为这是因为select-query基本上返回一个Values() - 对象所以我们必须省略它,这就是为什么我们不能在select-query之后添加其他参数。相反,我们将它们作为常量传递给select-query,因此它只是将它们放入它返回的Values-object中。
答案 1 :(得分:0)
通常,您始终在存储到数据库之前验证来自客户端的数据。只有在检查数据并找到正确的数据后,才能执行数据库操作。在这种情况下,您有两个插入。因此,您必须在一个事务中使用最后的commit语句执行此操作。我必须承认我不熟悉sql-server-ce,但我确信它具有与任何其他sql数据库一样的事务提交/回滚功能。