Php 如何向涉及外键依赖关系的多个表插入数据(MySQL)

Php 如何向涉及外键依赖关系的多个表插入数据(MySQL),php,mysql,sql,Php,Mysql,Sql,我正在寻找将数据插入多个MySQL表的最佳实践方法,其中一些列是外键依赖项。以下是一个例子: Table: contacts -------------------------------------------------------------------- | contact_id | first_name | last_name | prof_id | zip_code | ------------------------------------------------

我正在寻找将数据插入多个MySQL表的最佳实践方法,其中一些列是外键依赖项。以下是一个例子:

Table: contacts
--------------------------------------------------------------------
|  contact_id  |  first_name  | last_name  |  prof_id  |  zip_code  |
--------------------------------------------------------------------
“联系人”表有主键(联系人id),它只是自动递增,外键(教授id)引用“专业”表,外键(邮政编码)引用“邮政编码”表。这些表看起来像这样:

Table: profession
----------------------------
|  prof_id  |  profession  |
----------------------------
START TRANSACTION;
INSERT INTO foo (auto,text)
    VALUES(NULL,'text');         # generate ID by inserting NULL
INSERT INTO foo2 (id,text)
    VALUES(LAST_INSERT_ID(),'text');  # use ID in second table
COMMIT;
其中'prof_id'是一个INT NOT NULL自动增量主键,并且

Table: zip_code
--------------------------------
|  zip_code  | city  |  state  |
--------------------------------
其中'zip_code'是一个INT(5)非空主键

我想为一个新的人添加记录,比如:

first_name = 'John', last_name = 'Doe', profession = 'Network Administrator', city = 'Sometown', state = 'NY', zip_code = 12345

下面是我要做的:我想获取这些信息并将其插入到适当的表和列中。为了防止列中出现重复值(例如profession),我首先要确保没有“Network Administrator”的条目,如果有,我只想获取它的键值,如果没有,则插入它,然后获取它的键值。邮政编码、城市、州也是如此——如果存在,只需使用邮政编码键,否则插入新数据并获取相关键。然后,最后,我想使用提供的信息,包括与其他表中的职业和位置相关联的适当键值,将新联系人输入到“联系人”表中

我的问题是,最好的推荐方法是什么?我知道我可以坐在这里,写一条语句来检查给定的职业是否存在,如果不存在,那么就进入它,然后拿到钥匙。对邮政编码也要这样做。然后,最后将所有这些信息插入联系人中,但是我知道必须有更好的方法以更少的(也许是一个)语句来实现这一点,特别是考虑到这可能会导致一个问题,比如说,如果数据库在所有这些过程中暂时脱机。有没有一种方法可以将连接与此插入一起使用,从而使所有内容都级联到正确的位置?我应该用一系列语句来处理这个问题吗

我正处于学习SQL的阶段,但我觉得我到目前为止使用的书籍和资源已经有点跃升到使用嵌套查询和联接,假设我们已经填充了所有这些数据表。我甚至愿意接受关于我应该通过谷歌搜索来更好地了解这一点的建议,或者任何有助于填补这一空白的资源。理想情况下,我希望看到一些运行良好的SQL代码来实现这一点。如果有必要,假设PHP是与数据库交互的语言,但我的目标是命令行sql。提前感谢,希望我把一切都说清楚。

简而言之,您希望使用,以便插入的内容更清晰。这是确保插入所有(或无)数据的唯一方法。否则,您可能会遇到您描述的情况,即在某些插入之后数据库变得不可用,而其他插入无法完成。事务告诉数据库您正在做的是全部或全部不做,因此如果出现问题,它应该回滚

当您使用合成主键时,PHP和其他语言提供了获取最后插入的id的机制。如果您想完全在MySQL中执行此操作,可以使用此函数。您将得到如下代码:

Table: profession
----------------------------
|  prof_id  |  profession  |
----------------------------
START TRANSACTION;
INSERT INTO foo (auto,text)
    VALUES(NULL,'text');         # generate ID by inserting NULL
INSERT INTO foo2 (id,text)
    VALUES(LAST_INSERT_ID(),'text');  # use ID in second table
COMMIT;

你应该学习ORM。我使用的是教义2.2。通过使用ORM,您将能够插入/更新/删除,并且条令将处理所有关系。你想用手做任何事。教条是使用对象。所有的模型类都将为您生成。我知道ORM肯定会有价值,所以我感谢您提供的信息。然而,我想首先了解直接使用SQL的基本原理,下面@seanmk为我解答了这个问题。不管怎样,我认为你的信息可能对其他在这个问题上遇到障碍的人有用,所以我也给它加1。谢谢你快速简洁的回答。我还刚刚阅读了MySQL中使用变量的相关内容,我认为这会对我有所帮助,因为我需要跟踪多个以前的插入id值,而不仅仅是前一个。进一步阅读使我相信,我需要做一些类似“插入忽略到…”或“插入…在重复密钥更新时”的操作,以检查给定列中的现有值并避免重复信息-这听起来对您正确吗?是的,但要小心,因为插入。。。在重复密钥更新时,将锁定您试图插入的整个表,因此它的使用可能会导致大量数据库争用,因为其他请求必须等待它们完成。另一方面,此处讨论的INSERT IGNORE存在一些问题: