sud*_*udo 6 postgresql unique-constraint unicode
使用 PostgreSQL 9.5。似乎 Postgres 与它比较类似于??
. 一个唯一的约束是考虑一些相等的字符串,GROUP BY
而这些字符串是不同的。
我有一个GROUP BY
在TEXT
列上使用的选择查询和在其他一些列上使用的聚合函数以确保TEXT
输出中列的唯一性,并且我将结果插入到具有主键(因此是唯一的)约束的表中这TEXT
列。
看起来与此相似;为简单起见,我刚刚更改了表名:
INSERT INTO mytable ( % mytable has string TEXT PRIMARY KEY, score INT
SELECT
sq1.string string, sq2.score / sq1.score
FROM
(
SELECT n.string string, SUM(n.score) score
FROM
othertable1 n % has string TEXT (non-unique) and score INT
GROUP BY string
) sq1,
(
SELECT n.string string, SUM(n.score) score
FROM
othertable2 n % has string TEXT (non-unique) and score INT
GROUP BY string
) sq2
WHERE sq1.string = sq2.string
ORDER BY score DESC LIMIT 100000
);
Run Code Online (Sandbox Code Playgroud)
这应该永远不会失败,对吧?它失败了:由于键违反了唯一约束??
。
并且它在 PG 9.3 中曾多次与其他包含数百万行的数据集一起使用;不知道有没有??
当时在数据中。我知道阿拉伯语有可以放在字母上的装饰品,所以我想知道这是否会绊倒它。
有没有人有其他解释,或者我应该在可以更轻松地重现它后将其报告为错误?
更新:确认查询在具有相同数据的 PostgreSQL 9.3 服务器上成功运行。这里有一些变动的部分,所以我试图确切地找出有问题的字符串是什么,以便我可以制作一个简单的查询列表,任何人都可以运行以暴露错误。
更新 2:啊,我无法让我的数据库给我一组我可以复制到表中并暴露错误的字符串。我一直在尝试用COPY TO
. 我认为,一路上的某些事情不断剥夺阿拉伯文本导致其失败的差异。但是我尝试了一个更简单的查询,它也失败了。更明显的是,这应该有效:
INSERT INTO mytable ( % mytable has string TEXT PRIMARY KEY, score INT
SELECT n.string string, SUM(n.score) score
FROM
othertable2 n % has string TEXT (non-unique) and score INT
GROUP BY string
);
Run Code Online (Sandbox Code Playgroud)
我仍在努力获得其他人可以尝试的东西,因为当然,如果我说它只适用于我的数据,那么错误报告毫无用处。
更新 3:我用不同的数据再次运行它并遇到了与西里尔字符?
和?
. 制作一张包含它们的桌子并没有透露任何信息。我认为与阿拉伯文本的问题相同。一路上有些东西正在被剥离。
更新 4:这绝对是一个错误。我还在想办法报告这个问题。我找到了一个解决方法:
WITH glitch(string, score) AS (
SELECT n.string string, SUM(n.score) score
FROM
othertable2 n % has string TEXT (non-unique) and score INT
GROUP BY string
)
INSERT INTO mytable ( % mytable has string TEXT PRIMARY KEY, score INT
SELECT DISTINCT ON(string) * FROM glitch
);
Run Code Online (Sandbox Code Playgroud)