【发布时间】:2011-01-27 23:32:06
【问题描述】:
我有两张这样的表:
CREATE TABLE people (
id INT NOT NULL,
PRIMARY KEY (id)
)
CREATE TABLE pairs (
person_a_id INT,
person_b_id INT,
FOREIGN KEY (person_a_id) REFERENCES people(id),
FOREIGN KEY (person_b_id) REFERENCES people(id)
)
我想从 people 表中随机选择一对人,在选择他们之后,我将随机选择的对添加到 pairs 表中。 person_a_id 总是指具有较低 id 对的人(因为对的顺序不相关)。
问题是我不想两次选择同一对,所以我需要在返回随机选择的对之前检查对表。
是否有可能以相当高效和优雅的方式仅使用一个 SQL 查询来做到这一点?
(我正在使用 Java Persistence API 执行此操作,但希望我能够将任何答案转换为 JPA 代码)
【问题讨论】:
-
这可能可行,但不会很漂亮。
-
我看不出这在基于集合的方法中是如何实现的。我可以使用游标解决它(因此可以在单个存储过程中完成)。最大的障碍是您的选择池必须随着您添加到对表中的每个随机对而减少。
-
这是 MySQL 缺乏对检查约束的支持的地方。在这种情况下,检查强制 person_a_id
-
@Mark Byers - 排序并不是这里真正的问题。在这种情况下,MySQL 在数据完整性方面当然不会摇摆不定。只有使用触发器才能强制执行 A
-
其他没有提到的是“随机性如何?”。从技术上讲,people 表的交叉连接是“随机的”;只是不是特别难以预测。分布必须是什么样的?成对的会员资格有限制吗?例如,person_id = 42 可以在每一对中吗?我认为在这种情况下,最好的解决方案是在记录使用的对并让数据库作为防止重复的最后一道防线时,在 Java 中生成随机化。