我是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行。匹配中的名称在每一行上都是唯一的。现在,我在name字段上做一个内部连接,以确定哪些片段与哪个匹配。我希望将表复制到一组新的表中,并在段中设置一个外键,其中包含匹配行中的唯一ID,这既可以提高性能,也可以解决一些名称不总是完全相同的问题(而且它们应该是相同的)。
是否有一种方法可以执行单个INSERT或UPDATE语句来进行名称比较并将外键添加到段表中的每一行--至少对于名称完全相同的行?(对于不匹配的部分,我可能需要编写一个SQL函数来“清除”名称,在比较之前删除额外的空格和特殊字符)
感谢任何人给我的任何帮助!
发布于 2014-03-28 21:49:40
下面是我考虑这样做的一种方法:添加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语句)通常不是填充列的最有效方法。但是,似乎很多人认为它比(通常)更有效的替代方案更容易理解,它使用这样的联接操作进行更新:
UPDATE `SEGMENT` s
JOIN `MATCH` m
ON m.name = s.name
SET s.match_id = m.id发布于 2014-03-28 21:49:49
ID字段,您的MATCH表并填充它。MATCHID表中添加了一个列foriegn key(将是您的foriegn key) -注意,在正确映射记录之前,您无法将其设置为Foreign Key。使用以下查询更新foreign keys
UPDATE A
FROM SEGMENT A
INNER JOIn MATCH B
on A.NAME=B.NAME
SET MATCHID = B.IDhttps://stackoverflow.com/questions/22723686
复制相似问题