关于这个问题,我已经看过很多关于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
预期功能应如下;
INSERT NEW
当插入新项目时,用户应该能够将其插入到他/她期望的任何位置。现在,我只是通过删除OrderPosition = 10行,将新记录OrderPosition指定为0并重新排序表,设法将新记录插入第一个位置。但是客户想要选择项目应该去哪个位置。在这种情况下,我假设,OrderPosition = 10将再次被删除?
DELETE
当删除此表中的记录时,由于总共有10条记录,我需要从另一个表[tblNews]获取最新输入的记录并将其插入第10个位置(我可以得到最后一个)记录来自tblNews,按输入日期的顺序排序。)由于我不知道他们将删除哪条记录,我不知道如何在删除记录后重新排序表。
非常感谢任何文章的帮助,代码和方向。
===========编辑====================
答案中提到的UPDATE方法对我来说不起作用; 例如用户想要将新记录插入第5个订单位置。这意味着,订单位置10将被删除,订单位置5,6,7,8和9的当前记录将增加一个
答案 0 :(得分: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 DEMO 强>
答案 1 :(得分: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也不会违反它。
答案 2 :(得分:0)
插入新项目时,用户应该可以将其插入任何项目 他/她的愿望。现在,我只设法插入新的 通过删除OrderPosition = 10
记录到第一个位置
从数据库返回的数据顺序由sql查询确定 - 我假设您所指的sql查询具有“按OderPosition排序”。
您可以以任何方式插入,更新任何记录。
update mytable set newsID = "newid" where orderposition=10
这没有意义:
当删除此表中的记录时,因为总会有一个 共有10条记录
答案 3 :(得分:0)
不确定问题是什么,但会尽力帮助。
首先,如果ColumnPosition只有10个不同的数字,它应该具有唯一的约束(以避免软件错误)。
现在说你要为第五个位置做这个,它必须看起来像: 从myTable中删除ColumnPosition = 5; 插入myTable(newsID,OrderPosition)值(val,5);
这应该在一个事务中发生,它假设你的rID是一个自动递增的ID。