2

这可能吗?这样做的原因是我正在使用像队列这样的表,按顺序弹出 TOP(1) 元素进行处理。我想插入一些要立即处理的行。顺便说一句,这是ce 3.5,谢谢。

4

3 回答 3

4

您需要一列来维护顺序,无论是身份还是时间戳。然后你可以执行“select top(1) order by x desc”来获取最新的。

于 2009-02-16T12:56:11.550 回答
3

在您的数据库上创建一个优先级列,然后对其进行排序(连同您的身份):

CREATE TABLE myqueue(priority INT NOT NULL, id INT IDENTITY NOT NULL PRIMARY KEY, payload VARCHAR(200) NOT NULL)

CREATE INDEX ix_myqueue(priority, id)

INSERT
INTO myqueue (priority, payload)
VALUES (0, 'Regular message')

INSERT
INTO myqueue (priority, payload)
VALUES (1, 'Urgent message')

SELECT id, payload
FROM myqueue
ORDER BY priority DESC, id DESC
TOP 1

id | payload
2  | Urgent message

DELETE
FROM mytable
WHERE id = 2

SELECT payload
FROM myqueue
ORDER BY priority DESC, id DESC
TOP 1

id | payload
1  | Regular message

DELETE
FROM mytable
WHERE id = 1
于 2009-02-16T13:01:34.313 回答
1

1)如果您将表格用作队列,则说明您使用了错误的工具来完成这项工作。表是一组固有的无序数据。这是因为

2) 可以根据任何字段的值对行进行排序。这意味着您可以通过添加具有值(通常是 ID)的行在中间“插入”某些内容,该值的值将位于表中的其他行之前。

为什么要使用数据库表来执行此操作?您显然正在寻找优先级队列。如果您这样做是因为您希望正在处理的作业在软件失败时仍然存在,请考虑将所有项目及其优先级添加到表中,然后将它们取出并将它们插入到适当的优先级队列中软件,将您的数据存储与调度机制分离。

于 2009-02-16T12:53:12.337 回答