3

关于这个问题,我已经看到了很多关于 SO 的问题,但没有一个与我的场景相关。除了进行基本的 CRUD 操作之外,我离 SQL 专家还差得很远。因此,我非常坚持这一点。

我有一张桌子。

myTable [rID, newsID, OrderPosition]在哪里;

rID is primaryKey int column, 
newsID int is the ID of an item from another table and,
OrderPosition int to hold the position of the rows. 

myTable 将始终总共有 10 行。

因此,最初,让我们假设 myTable 具有以下数据:

rID    newsID    OrderPosition
100    4000      1
101    4100      2
102    4200      3
103    4300      4
104    4400      5
105    4500      6
106    4600      7
107    4700      8
108    4800      9
109    4900      10

预期的功能应如下所示;

插入新的

插入新项目时,用户应该能够将其插入到他/她想要的任何位置。现在,我只设法通过删除 OrderPosition = 10 行、将新记录 OrderPosition 分配为 0 并重新排序表来将新记录插入到第一个位置。但是客户想要选择项目应该去的位置。在这种情况下,我假设 OrderPosition = 10 将再次被删除?

删除

当从这个表中删除一条记录时,由于一共有10条记录,我需要从另一个表[tblNews]中获取最新输入的记录并将其插入到第10位(我可以从tblNews中获取最后一条记录通过按输入日期降序排序。)由于我不知道他们将删除哪条记录,所以我不知道如何在删除记录后重新排序表。

任何帮助、代码、文章方向将不胜感激。

=========== 编辑 =====================

答案中提到的 UPDATE 方法对我不起作用;例如,用户想要在第 5 个订单位置插入一条新记录。这意味着,订单位置 10 将被删除,订单位置 5、6、7、8 和 9 的当前记录将加一

4

4 回答 4

4

我猜这样的东西对你有用:

CREATE PROC uspMyTableInsert
(
    @newsID INT, @order int
)
AS
BEGIN

    UPDATE MyTable
    SET OrderPosition = OrderPosition + 1
    WHERE OrderPosition >= @Order;

    INSERT INTO MyTable VALUES (@newsID, @order);

    DELETE FROM dbo.myTable WHERE OrderPosition = 11


END

因此,对于插入,您有 3 个步骤:

首先,您更新要遵循的项目顺序 (+1),然后插入您的项目,最后删除第 11 行。

与删除类似 - 也是 3 个步骤,但首先删除行,然后更新后续行的顺序(这次为 -1),最后插入新的第 10 行。

CREATE PROC uspMyTableDelete
(
    @order int
)
AS
BEGIN

    DELETE FROM dbo.myTable WHERE OrderPosition =@order

    UPDATE MyTable
    SET OrderPosition = OrderPosition -1
    WHERE OrderPosition > @Order;

    INSERT INTO MyTable 
    SELECT TOP 1 newsID, 10 
    FROM tblNews ORDER BY newsID DESC


END

SQLFiddle 演示

于 2013-06-24T09:29:11.553 回答
2

插入行时,您需要“移动”下面的行为其腾出空间。例如,可以像这样在位置 4 上插入:

DELETE FROM myTable WHERE OrderPosition = 10; -- If you want the keep the table from growing beyond 10 rows.
UPDATE myTable SET OrderPosition = OrderPosition + 1 WHERE OrderPosition >= 4;
INSERT INTO myTable VALUES (..., 4);

相反,删除该行后,您可以将其“下方”的行移回:

DELETE FROM myTable WHERE OrderPosition = 4;
UPDATE myTable SET OrderPosition = OrderPosition - 1 WHERE OrderPosition > 4;
-- Now you can insert the row on position 10 if desired.

请注意,即使 OrderPosition 有一个 UNIQUE 约束,UPDATE 也不会违反它。

[SQL 小提琴]

于 2013-06-24T09:25:14.427 回答
0

插入新项目时,用户应该能够将其插入到他/她想要的任何位置。现在,我只设法通过删除 OrderPosition = 10 将新记录插入到第一个位置

从数据库返回的数据顺序由 sql 查询确定 - 我假设您所指的 sql 查询具有“按 OderPosition 排序”。

您可以以任何方式插入、更新任何记录。

update mytable set newsID = "newid" where orderposition=10

这没有意义:

当该表中的一条记录被删除时,因为总会有 10 条记录

于 2013-06-24T09:13:07.623 回答
0

不太确定问题是什么,但会尽力提供帮助。

首先,如果 ColumnPosition 只有 10 个不同的数字,它应该具有唯一的约束(以避免软件错误)。

现在假设您要对位置 5 执行此操作,它必须看起来像: delete from myTable where ColumnPosition = 5; 插入 myTable (newsID, OrderPosition) 值 (val, 5);

这应该发生在事务中,并且假设您的 rID 是自动递增的 ID。

于 2013-06-24T09:15:49.313 回答