首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用单个SQL查询测试列的顺序性

使用单个SQL查询测试列的顺序性
EN

Stack Overflow用户
提问于 2010-05-13 19:34:45
回答 2查看 81关注 0票数 0

我有一个表,其中包含一组顺序数据集,如下所示:

ID set_ID some_column n

1 'set-1' 'aaaaaaaaaa' 1

2 'set-1' 'bbbbbbbbbb' 2

3 'set-1' 'cccccccccc' 3

4 'set-2' 'dddddddddd' 1

5 'set-2' 'eeeeeeeeee' 2

6 'set-3' 'ffffffffff' 2

7 'set-3' 'gggggggggg' 1

在对这些行进行几种类型的修改的事务结束时,我希望确保在单个集合中,"n“的所有值仍然是连续的(否则是回滚)。根据PK,它们不需要是相同的顺序,只是顺序,像1-2-3或3-1-2,但不像1-3-4或1-2-3-3-4。

由于在单个集合中可能有数千行的事实,我倾向于在数据库中这样做,以避免在做了一些小的改变之后仅仅为了验证而获取数据的开销。

另外还有并发性的问题。在InnoDB (可重复读取)中锁定的工作方式(据我所知)是,如果我在"n“上有一个索引,那么InnoDB也会锁定值之间的”间隙“。如果我将set_ID和n组合到一个索引中,会不会消除出现幻象行的问题?

在我看来这是个常见的问题。有什么好主意吗?

谢谢!

注意:使用MySQL + InnoDB

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2010-05-13 19:40:30

查找包含max - min + 1 > count的序列

代码语言:javascript
复制
IF EXISTS (SELECT set_ID
             FROM mytable
            GROUP BY set_ID
           HAVING MAX(n) - MIN(n) + 1 > COUNT(n)
          )
    ROLLBACK

如果序列必须从1开始,请执行以下操作:

代码语言:javascript
复制
IF EXISTS (SELECT set_ID
             FROM mytable
            GROUP BY set_ID
           HAVING MIN(n) = 1 AND MAX(n) > COUNT(n)
          )
    ROLLBACK

您还需要避免重复的序列号。但这可以通过在set_IDn上创建一个唯一的密钥来实现。

票数 1
EN

Stack Overflow用户

发布于 2010-05-13 19:47:43

试试这个:

代码语言:javascript
复制
IF EXISTS (SELECT set_ID
               FROM mytable
               GROUP BY set_ID
               HAVING MIN(n) = 1 AND MAX(n) <> COUNT(DISTINCT n)
          )
    ROLLBACK

在SQL Server上工作(我没有MySql来试用):

代码语言:javascript
复制
DECLARE @YourTable table (ID int, set_ID char(5), some_column char(10),n int)
INSERT @YourTable VALUES (1, 'set-1' ,'aaaaaaaaaa' ,1)
INSERT @YourTable VALUES (2, 'set-1' ,'bbbbbbbbbb' ,2)
INSERT @YourTable VALUES (3, 'set-1' ,'cccccccccc' ,3)
INSERT @YourTable VALUES (4, 'set-2' ,'dddddddddd' ,1)
INSERT @YourTable VALUES (5, 'set-2' ,'eeeeeeeeee' ,2)
INSERT @YourTable VALUES (6, 'set-3' ,'ffffffffff' ,2)
INSERT @YourTable VALUES (7, 'set-3' ,'gggggggggg' ,1)
INSERT @YourTable VALUES (8, 'set-3' ,'ffffffffff' ,4)
INSERT @YourTable VALUES (9, 'set-3' ,'ffffffffff' ,4)

--this will list all "bad" sets
SELECT set_ID
    FROM @YourTable
    GROUP BY set_ID
    HAVING MIN(n) = 1 AND MAX(n) <> COUNT(DISTINCT n)

输出:

代码语言:javascript
复制
set_ID
------
set-3
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/2826370

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档