通过匹配表之间的字符串来创建外键

时间:2014-03-28 21:41:45

标签: mysql sql foreign-keys

我是SQL的初学者,所以这可能是一个非常新手的问题,但我似乎无法直截了当。我有一对名为MATCHSEGMENT的表格。

MATCH.id int(11) ai pk
MATCH.name varchar(45)
etc.

SEGMENT.id int(11) ai pk
SEGMENT.name varchar(45)
etc.

MATCH中的每一行都可以有一个或多个SEGMENT行。 MATCH中的名称在每一行都是唯一的。现在,我在名称字段上进行内部联接,以确定哪些段与哪个匹配。我想将表复制到一组新表并在SEGMENT中设置一个包含MATCH行中唯一ID的外键,以提高性能并解决名称并不总是完全相同的一些问题(和他们应该是)。

有没有办法执行单个INSERT或UPDATE语句来进行名称比较,并将外键添加到SEGMENT表中的每一行 - 至少对于名称完全相同的行? (对于那些不匹配的,我可能必须编写一个SQL函数来通过在比较之前删除额外的空格和特殊字符来“清理”名称)

感谢任何人都能给我的帮助!

2 个答案:

答案 0 :(得分:0)

这是我考虑这样做的一种方法:添加FK列,添加约束定义,然后使用相关子查询使用UPDATE语句填充列:

ALTER TABLE `SEGMENT` ADD COLUMN match_id INT(11) COMMENT 'FK ref MATCH.id' ;

ALTER TABLE `SEGMENT` ADD CONSTRAINT fk_SEGMENT_MATCH 
  FOREIGN KEY (match_id) REFERENCES `MATCH`(id) ; 

UPDATE `SEGMENT` s
   SET s.match_id = (SELECT m.id
                       FROM MATCH m 
                      WHERE m.name = s.name) ;

相关子查询(如上面的示例UPDATE语句中所示)通常不是填充列的最有效方法。但似乎很多人认为它比(通常)更有效的替代方案更容易理解,使用这样的JOIN操作的UPDATE:

UPDATE `SEGMENT` s
  JOIN `MATCH` m
    ON m.name = s.name
   SET s.match_id = m.id

答案 1 :(得分:0)

  1. ID表中添加MATCH字段并填充它。
  2. 他们会在您的MATCHID表格中添加一列foriegn key(这将是您的SEGMENT) - 请注意,您无法将其设置为Foreign Key,直到您拥有正确映射记录
  3. 使用以下查询更新foreign keys

    UPDATE A
    FROM SEGMENT A
    INNER JOIn MATCH B
    on A.NAME=B.NAME
    SET MATCHID = B.ID