2

我有以下问题,我想知道是否可以在本机 SQL 中解决它。假设我有一个无向图,它在 2 个节点之间不得包含超过一条边。

我想在一个数据库表中表示它,它具有例如以下方案和内容:

    ID|Node1|Node2|
    ---------------
    1 | A   | B   |
    2 | B   | C   |
    3 | D   | E   |
    4 | F   | D   |

我想在 MySQL 的数据库级别设置一个约束来防止,我可以将以下记录添加到上面的表中

    5 | B   | A   |

有人知道 MySQL 中有什么解决方案吗?

提前致谢!

4

2 回答 2

0

如果 MySQL 支持 CHECK 约束,你可以简单地:

CREATE TABLE Edge (
    Node1 VARCHAR(50),
    Node2 VARCHAR(50),
    Direction ENUM('forward', 'backward'),
    PRIMARY KEY (Node1, Node2),
    INDEX (Node1, Node2),
    CHECK (Node1 <= Node2) -- Use < if you don't want self-referencing.
);

INSERT INTO Edge VALUES
    ('A', 'B', 'forward'),
    ('B', 'C', 'forward'),
    ('D', 'E', 'forward'),
    ('D', 'F', 'backward');

[SQL 小提琴]

然后,如果你尝试,你会得到 PRIMARY KEY 违规:

INSERT INTO Edge VALUES ('A', 'B', 'backward');

不幸的是,MySQL 将允许...

INSERT INTO Edge VALUES ('B', 'A', 'forward');

...尽管有 CHECK 约束,所以您必须在触发器或应用程序逻辑中防止这种情况。

于 2013-09-24T09:59:54.600 回答
0

您对“排序”节点名称是否满意?也就是说,Node1 的值保证小于 Node2。

例如,对 (C, A) 保证写成: (A, C)

您的代码应该解决这个问题;您可以使用 min/max 来处理它。

于 2013-10-25T23:08:09.917 回答