我是SQL的初学者,所以这可能是一个非常新手的问题,但我似乎无法直截了当。我有一对名为MATCH
和SEGMENT
的表格。
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 :(得分: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)
ID
表中添加MATCH
字段并填充它。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