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

2024-04-30

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

Table: contacts
--------------------------------------------------------------------
|  contact_id  |  first_name  | last_name  |  prof_id  |  zip_code  |
--------------------------------------------------------------------

“联系人”表有主键(contact_id),它只是自动增量,还有外键(prof_id)引用“职业”表,外键(zip_code)引用“zip_code”表。这些表看起来像这样:

Table: profession
----------------------------
|  prof_id  |  profession  |
----------------------------

其中 'prof_id' 是 INT NOT NULL AUTO_INCRMENT PRIMARY KEY,并且

Table: zip_code
--------------------------------
|  zip_code  | city  |  state  |
--------------------------------

其中“zip_code”是一个 INT(5) NOT NULL 主键。

我想为一个新人添加记录,比方说:

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

这就是我想要做的:我想获取该信息并将其插入到适当的表和列中。为了防止列中出现重复值(例如职业),我首先要确保还没有“网络管理员”条目,如果有,我只想获取其键值,如果不是插入它然后获取它的键值。对于 zip_code、城市、州也是如此 - 如果存在,则只需使用该 zip_code 键,否则插入新数据并获取关联的键。最后,我想使用提供的信息将新联系人输入到“联系人”表,包括其他表中与职业和位置相关的适当键值。

我的问题是,最好的推荐方法是什么?我知道我可以坐在这里编写单个语句来检查给定的职业是否存在,如果不存在则输入它,然后获取密钥。对 zip_code 执行相同的操作。然后最后将所有这些插入到联系人中,但是我知道必须有一种更好的方法可以用更少(也许是一个)语句来完成此操作,特别是考虑到如果数据库在中间暂时离线,这可能会导致问题所有这一切。有没有一种方法可以将 JOIN 与此 INSERT 结合使用,从而使所有内容基本上级联到正确的位置?我应该用 TRANSACTION 系列语句来处理这个问题吗?

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


简而言之,你想使用交易 http://dev.mysql.com/doc/refman/5.0/en/ansi-diff-transactions.html (更多关于此的文档) http://dev.mysql.com/doc/refman/5.0/en/commit.html这样你的插入是atomic https://en.wikipedia.org/wiki/Atomic_operation。这是保证插入所有(或没有)数据的唯一方法。否则,您可能会遇到您所描述的情况,即在某些插入后数据库变得不可用,而其他插入则无法完成。事务告诉数据库您正在做的事情是全有或全无,因此如果出现问题,它应该回滚。

当您使用合成主键时,PHP 和其他语言提供了获取最后插入的 id 的机制。如果你想完全在 MySQL 中完成,你可以使用最后插入 ID() http://dev.mysql.com/doc/refman/5.0/en/getting-unique-id.html功能。你最终会得到这样的代码:

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;
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

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

随机推荐