我有一张桌子,看起来像这样:

CREATE TABLE `library_mix` (
  `lib_mix_id` VARCHAR(64) NOT NULL ,
  `date` DATE NOT NULL ,
  `index1` VARCHAR(64) NULL ,
  `index2` VARCHAR(64) NULL ,
  `index3` VARCHAR(64) NULL ,
  `index4` VARCHAR(64) NULL ,
  `index5` VARCHAR(64) NULL ,
 ...
  `index96` VARCHAR(64) NULL ,
 ...
)


对于index1到index96的每个,我想添加相同的外键约束。理想情况下,我想在程序化循环中创建索引和fk约束,但是我不清楚如何在MySQL中执行此操作,也没有找到任何好的示例。就像是:

CREATE TABLE `library_mix` (
  `lib_mix_id` VARCHAR(64) NOT NULL ,
  `date` DATE NOT NULL ,

for i = 1 to 96
  `index`$i VARCHAR(64) NULL,
end
...
for i = 1 to 96
  CONSTRAINT `fk_library_mix_lib_id`$i
  FOREIGN KEY (`lib_id` )
  REFERENCES `library` (`lib_id` )
  ON DELETE NO ACTION
  ON UPDATE NO ACTION)
end)


有没有一种简单的方法可以代替将所有内容键入96次?

编辑

我对以下某些评论的回答太长,因此我在此处添加。


上面的“库”一词是指DNA片段的物理集合(在试管中)(我认为库对此是一个可怕的术语,但我没有加以补充并坚持使用)。
每个文库都有与每个片段相连的条形码(也由DNA制成),并与其他DNA文库混合(只要这些文库具有不同的条形码)
有96种可能的条形码(此处由“ index1”至“ index96”标识)。


因此,在此表中,我试图对DNA库的特定混合进行建模。外键约束是为了确保库ID在库表中存在。

可能有用的附加信息:


不同的DNA文库可以具有相同的条形码(因此不能混合在一起)
一个DNA文库可以混合在一起
一个DNA样品可以具有多个DNA库(具有相同或不同的条形码)


我很高兴听到比使用每栏一栏更好的建模方法。

谢谢!

凯文

编辑2
@eggyal在评论中的建议是解决此问题的正确方法。 (我的新手错误。)谢谢!

最佳答案

我将回答您的问题,但看来您与图书馆之间存在多对多关系,但您无法正确解决。 eggyal和Thomas的评论非常有效。请研究如何在数据库中创建适当的一对多和多对一关系。这将使此问题容易得多。

为了轻松创建约束,您可以打开与MySQL服务器的连接并执行以下命令:

SELECT  CONCAT("CONSTRAINT `fk_library_mix_lib_id`",COLUMN_NAME,"
    FOREIGN KEY (`",COLUMN_NAME,"` )
    REFERENCES `library` (`lib_id` )
    ON DELETE NO ACTION
    ON UPDATE NO ACTION ") AS SQLStatement
FROM INFORMATION_SCHEMA.COLUMNS
WHERE Table_NAME ="library_mix"
AND COLUMN_NAME LIKE "index%"


您可以将结果复制并粘贴到新的查询窗口中并执行。我尚未测试生成的语法,但是您应该以最小的努力就能修改查询以创建正确的SQL命令字符串。我将其留给您练习,因为它肯定会增强您对MySQL数据字典的了解。基本上,请阅读有关MySQL中的INFORMATION_SCHEMA视图的信息,它们使这样的事情变得轻而易举。

关于mysql - 向表的96列添加相同的外键,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/10728537/

10-11 13:37