2014-03-28 53 views
1

我是一个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函数来清除名称,通过删除额外的空白和特殊字符进行比较)

感谢任何帮助,任何人都可以给我!

回答

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 
0
  1. 添加ID场您在MATCH表和填充它。
  2. 他们增加一列MATCHID(这将是你的foriegn key)到您的SEGMENT表 - 请注意,您将无法设置此为Foreign Key,直到你映射记录正确

使用下面的查询来更新foreign keys

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

UPDATE语句看起来像是SQL Server(Transact-SQL)语法,而不是有效的MySQL语法。 – spencer7593

+0

谢谢@ spencer7593,改变了它。 – SoulTrain

相关问题