首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >通过表间字符串的匹配来创建外键

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

Stack Overflow用户
提问于 2014-03-28 21:41:45
回答 2查看 222关注 0票数 1

我是SQL的初学者,所以这可能是一个非常新鲜的问题,但我似乎无法理解它。我有一对表,名为MATCHSEGMENT

代码语言:javascript
复制
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函数来“清除”名称,在比较之前删除额外的空格和特殊字符)

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

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2014-03-28 21:49:40

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

代码语言:javascript
复制
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语句)通常不是填充列的最有效方法。但是,似乎很多人认为它比(通常)更有效的替代方案更容易理解,它使用这样的联接操作进行更新:

代码语言:javascript
复制
UPDATE `SEGMENT` s
  JOIN `MATCH` m
    ON m.name = s.name
   SET s.match_id = m.id
票数 1
EN

Stack Overflow用户

发布于 2014-03-28 21:49:49

  1. 添加一个ID字段,您的MATCH表并填充它。
  2. 他们向您的MATCHID表中添加了一个列foriegn key(将是您的foriegn key) -注意,在正确映射记录之前,您无法将其设置为Foreign Key

使用以下查询更新foreign keys

代码语言:javascript
复制
UPDATE A
FROM SEGMENT A
INNER JOIn MATCH B
on A.NAME=B.NAME
SET MATCHID = B.ID
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/22723686

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档