我有以下问题,我想知道是否可以在本机SQL中解决它。 假设我有一个无向图,它不能在两个节点之间包含多个边。
我想在数据库表中表示它,例如以下方案和内容:
ID|Node1|Node2|
---------------
1 | A | B |
2 | B | C |
3 | D | E |
4 | F | D |
我想在MySQL中设置一个数据库级别的约束来防止,我可以将以下记录添加到上面的表中
5 | B | A |
有人在MySQL中知道任何解决方案吗?
提前致谢!
答案 0 :(得分: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');
然后,如果您尝试,则会收到PRIMARY KEY违规行为:
INSERT INTO Edge VALUES ('A', 'B', 'backward');
不幸的是,MySQL会允许......
INSERT INTO Edge VALUES ('B', 'A', 'forward');
...尽管存在CHECK约束,因此您必须在触发器或应用程序逻辑中防止这种情况。
答案 1 :(得分:0)
你可以'排序'节点名称吗?也就是说,保证Node1的值小于Node2。
例如,保证对(C,A)写为:(A,C)
你的代码应该照顾好这个;你可以用min / max来处理它。