0

这是对我的另一个问题的一种跟进:分隔的 id 字符串作为字段还是单独的表?

我有一个数据库,其中包含一个产品表、一个类别和一个像“productsInCategories”(在另一个问题中描述)。productsInCategories 表有两个字段:productId 和 categoryId。

当我想从一个类别中获取所有产品时,我会执行以下操作:

SELECT *
FROM Products
INNER JOIN ProductsInCategories
ON Products.Id=ProductsInCategories.productId

它运作良好,我认为这是正确的方法吗?

无论如何,我不确定如何以最佳方式插入新产品。客户端发送新产品的属性,以及它应该添加到的类别的 id。服务器对 Products-table 执行 INSERT 查询,并在 ProductsInCategories 上执行一个查询,在其中插入新创建的产品的 id 和客户端指定的 category-id。这样做的问题是用户当然可以发送自定义数据,并指定不属于他的类别。

我应该先做一个 SELECT 并获取用户指定的类别的 userID,然后检查它是否与当前用户的 id 匹配?或者 ProductsInCategories 是否也应该包含一个 userId 字段(似乎是多余的?)?或者最好,有没有办法在 SELECT 查询中验证这一点?

4

2 回答 2

1

我想出了一种在插入查询中放置一种条件的方法。这是如何:

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

如果客户端提供了一个受惊的类别 ID,则 select 语句将找不到任何记录(除非该类别由同一用户拥有,以防我们不关心)并且不会插入任何内容。然后我们将检查插入了多少行(我使用的 WebMatrix.Data.Database 的执行函数将受影响的记录数返回为一个 int,然后为 0),如果没有则回滚。

至少对我来说,带有嵌套 SELECT 的 INSERT 看起来很有趣。没有“Values()”,第二个不相关的参数在它的中间。我还没有真正查找过任何相关内容,也没有任何事实,但我认为这是因为选择查询基本上返回一个 Values() 对象,所以我们必须忽略它,这就是为什么我们不能在选择查询之后也添加其他参数。相反,我们将它们作为常量传递给选择查询,因此它只会将它们放在它返回的值对象中。

于 2013-05-11T15:46:37.413 回答
0

通常,您总是在存储到数据库之前验证来自客户端的数据。只有在检查数据并发现正确后,您才能进行数据库操作。在这种情况下,您有两个插入。所以你必须在一个事务中完成,最后有一个提交语句。我必须承认我不熟悉 sql-server-ce,但我确信它与任何其他 sql 数据库一样具有事务提交/回滚功能。

于 2013-05-11T12:14:44.557 回答