关于两列值组合的唯一约束

时间:2018-01-17 18:20:17

标签: mysql node.js

如果这听起来很奇怪,我不确定如何说出这个问题。

我的数据库中有一个名为// The minimum and maximum values for d - also the 'input' const minDValue = 0.004; const maxDValue = 0.1; // The minimum and maximum values for scale - also the 'output' const minScaleValue = 0.1; const maxScaleValue = 1; // Absolute ranges for d and scale: const dRangeAbs = maxDValue - minDValue; const scaleRangeAbs = maxScaleValue - minScaleValue; // restricts the value of d if it exceeds the bounds: // 'minDValue <= d <= maxDValue' function restrictD(d) { return Math.max(minDValue, Math.min(maxDValue, d)); } // Calculate the absolute scale value for a certain d-value. function scaleForDValue(d) { // First, restrict the input. If not restricted the input 'scale' is // not accurate, and we can not determine the corresponding scale. d = restrictD(d); // Determine how far (as fraction of 1) the d-value sits along // the absolute d-range: const dProgressFraction = (d - minDValue) / dRangeAbs; // Use the d-progress-fraction to add a corresponding relative // progress value for the scale-'scale'. Because the scale is // inverted, we subtract the progress from the max-value this // time. const calculatedScale = maxScaleValue - (dProgressFraction * scaleRangeAbs); // Restrict calculated value to prevent rouding error. return Math.min(maxScaleValue, Math.max(minScaleValue, calculatedScale)); } // Log some values! const log = (val, info) => console.log({ d: val, scale: scaleForDValue(val), info }); log(minDValue, 'this is the min d-value'); log(minDValue - 1, 'this is a too low d-value'); log(maxDValue, 'this is the max d-value'); log(maxDValue + 1, 'this is a too high d-value'); for (let i = 0; i < 5; i++) { log(minDValue + Math.random() * dRangeAbs, 'A random d-value'); }的表,其中包含以下列:friendRequestsidsender_idrecipient_id。如何确保没有其他行具有重复的statusrecipient_id值?

例如,如果我在表格中有一行包含以下值:sender_id,我怎样才能确保没有其他行的(1, 4, 6, 0)为4和{{1} 6个 AND ,没有其他行的sender_id为6,recipient_id为4?

3 个答案:

答案 0 :(得分:0)

您必须在表格上创建唯一索引。

create unique index sender_recipient
on friendRequest (sender_id, récipient_id) 

答案 1 :(得分:0)

我听到的是,如果用户A邀请用户B,则您不想为使用A的用户B创建新记录。

我不认为可以强制执行这样的约束,除非可能通过使用触发器,我可能不会推荐。我建议您在申请中尝试执行此操作。

答案 2 :(得分:0)

对于same relations - 在<sender, receiver>上使用唯一约束。

然而,反向关系<receiver, sender>是可能的,因为它是唯一键约束的不同ID。

要处理这个问题(使用uniqe键约束),你必须添加另一个列,让我们称之为friendship - 在那里,你将添加一个唯一的键约束,并插入用户id,连接,BUT订购:

即。如果用户310发送了好友请求,您就会将3-10插入该列。如果邀请从10发送到3,您也会添加3-10

通过这种方式,您可以跟踪世卫组织发起的友谊(sender_column=3receiver-column=10),同时确保没有向后邀请(friendship=3-10已存在)

这就像

INSERT INTO friendships(sender, receiver, friendship) VALUES(3,10,"3-10");
or vice versa:
INSERT INTO friendships(sender, receiver, friendship) VALUES(10,3,"3-10");

如果已经请求了友谊,则其中一个约束将避免插入。 (实际上,第二个约束对于任何情况都是足够的,前两列只允许确定友谊的主动和被动部分。)