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

Isa*_*rro 5 mysql database f#

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

Experiments         |       Results           |        Gene 
Experiment id       |       Experiment id     |        Gene id 
Experiment name     |       Gene id           |        Gene Name                         
                    |       Value             |
Run Code Online (Sandbox Code Playgroud)

现在,我正在尝试使用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()
Run Code Online (Sandbox Code Playgroud)

我很难理解结果值实验和基因ID相关联。当我尝试提交它时,它给出了一个错误:“ 字段'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()
Run Code Online (Sandbox Code Playgroud)

确实,在关联表中添加某些内容(结果)之前,必须进行查询以获取ID值。之后,由于查询按顺序(Seq)返回,因此我仅转换为正确的类型(数据库中已描述)。我希望这也可以在将来对某人有所帮助。