2

我正在开发一个应用程序,它需要保存有关两个城市之间距离的数据。

我在 Mysql 数据库中创建了一个距离表,其中包含两个城市的名称和它们之间的距离。我已将两个城镇列设为复合主键。

我希望数据库限制应用程序制作重复的反向条目,如屏幕截图所示,以防止具有不同的距离值。

解决这个问题的最佳解决方案是什么?

带有反向城市条目的距离表的屏幕截图,这应该是不可能的

4

2 回答 2

2

您可以创建一个存储过程以插入到该表中。

DELIMITER $$
CREATE PROCEDURE insert_distance(IN p_town1 varchar(50), IN p_town2 varchar(50), IN p_distance int)
BEGIN
INSERT INTO distance(town1, town2, distance)
SELECT LEAST(p_town1, p_town2), GREATEST(p_town1, p_town2), p_distance;
END $$
DELIMITER ;

仅使用此过程插入您可以确保当条目已存在时引发错误。而且您不会以错误的顺序意外插入城镇。

于 2013-11-07T13:33:45.640 回答
0

MariaDB 是 MySQL 的一个分支,提供虚拟列。如果您使用的是 MariaDB,您可以创建这样一个虚拟列并声明它是唯一的。

但是,您可能还没有 MariaDB。因此,您将很难实施防止重复条目的业务规则。您当然可以使用系统地忽略禁止条目(其中 town_2 < town_1)的查找方案。

 SELECT town_1, town_2, distance
   FROM distance
  WHERE town_2 > town_1

将检索所有有效条目。此查询将检索作为查询参数提供的两个城镇之间的距离,即使两个城镇名称的顺序错误。(使用 JOIN 的猴子业务允许每个城镇名称参数仅在查询中出现一次,即使它被多次使用。)

SELECT town_1, town_2, d.distance
  FROM (
    SELECT ? AS a, ? AS b
  ) cities
  JOIN distance AS d ON
       ( town_1 = LEAST(a,b) AND town_2 = GREATEST(a,b))
于 2013-11-07T13:31:26.750 回答