繁体   English   中英

在所有表中的MySQL db中插入数据

[英]Insert data in MySQL db in all tables

在这里,我再次寻求帮助。 :)我正在尝试使用F#将数据插入我的MySQL数据库。 我的架构包括3个表(实验,基因和结果):

Experiments         |       Results           |        Gene 
Experiment id       |       Experiment id     |        Gene id 
Experiment name     |       Gene id           |        Gene Name                         
                    |       Value             |

现在,我正在尝试使用SQLProvider将数据添加到数据库中。

let db = sql.GetDataContext()

let gene_tb = db.Vp32.Genes
let exp_tb = db.Vp32.Experiments
let results_tb = db.Vp32.Results

let createNewInput (genename: string) (expname: string) res =
    let newRes = results_tb.Create()
    let newGene = gene_tb.Create()
    let newExp = exp_tb.Create()

    newGene.GeneName <- genename
    newExp.ExpName <- expname
    newRes.ResultVal <- Some res

createNewInput "test1"  "experiment_test1" (float32 999.5)

db.SubmitUpdates()

我有问题要让它理解结果值实验和基因ID相关联。 当我尝试提交它时出现错误:“ Field'Exp_id'没有默认值 ”。 好吧,没有默认值,因为它应该是其他表的ID。 哦,和..这些ID设置为自动增加。 此外,每次添加新数据时,如果表中已存在实验名称,则id不应增加。 我是否必须使用'if ... then'为此或某些规范代码执行类似“触发器”的操作?

非常感谢你提前! :D谢谢你,我已经学到了太多的东西,我简直不敢相信! ^ - ^

解决方案 :所以,我发现问题是我必须查询实验和基因的ID ..所以我改变了一些东西。 现在我有3个函数(每个表一个),结果一个在添加结果值之前做一个小查询:

let addNewExp (expname: string)=
    let newExp = exp_tb.Create()
    newExp.ExpName <- expname
    db.SubmitUpdates()

let addNewGene (genename: string)=
    let newGene = gene_tb.Create()
    newGene.GeneName <- genename
    db.SubmitUpdates()

let addNewRes (expName: string) (geneName: string) res =
    let tempExpId = 
        query {
            for experiment in exp_tb do
                where (experiment.ExpName = expName)
                select experiment.ExpId
            }
        |> Seq.head

    let tempGeneId = 
        query {
            for gene in gene_tb do
                where (gene.GeneName = geneName)
                select gene.GeneName
            }
        |> Seq.toArray |> String.concat ""

    let newRes = results_tb.Create()
    newRes.ExpId <- tempExpId
    newRes.GeneId <- tempGeneId
    newRes.ResultVal <- Some res
    db.SubmitUpdates()

实际上,在关联表(结果)中添加内容之前,有必要执行查询以获取id值。 之后我只是转换为正确的类型(在数据库中描述),因为查询返回为序列(Seq)。 我希望这也可以帮助将来的某个人。

我实际上没有尝试过这个,所以它可能不对 - 但我认为一个应该工作的策略是首先将Experiment记录(带ExpName )与Gene记录一起GeneName

然后,当您调用SubmitUpdates ,提供程序应插入两个记录(这应该有效,因为它们具有所需的所有字段)并填充插入记录的Experiment idGene id属性。

然后你有这些ID,所以你应该创建一个包含所有正确ID的新Result记录,插入它并再次调用SubmitUpdates

(可能有更好的方法,但这可以解决问题...)

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM