【发布时间】:2023-03-18 23:54:01
【问题描述】:
This question 正确解释了如何同时在数据库中插入数据以实现“分层”结构(is-a 关系):
不,您不能在一个 MySQL 命令中插入多个表。你 但是可以使用事务。
BEGIN; INSERT INTO base_class (data0, data1) VALUES('0', '1'); INSERT INTO derived_class (base_id, data2, data3) VALUES(LAST_INSERT_ID(), '2', '3'); COMMIT;
该解决方案在一次插入一个东西时效果很好。
但是,我需要使用 INSERT...SELECT 同时插入多个值。
BEGIN;
INSERT INTO base_class (data0, data1) SELECT d0, d1 FROM stuff
INSERT INTO derived_class (base_ids, data2, data3) SELECT ???, d2, d3 FROM stuff
COMMIT;
我应该如何告诉 MySQL 通过基类 ID 将 derived_class 的每个实例“链接”到先前创建的 base_class?
理想情况下,我会同时“循环”两个表,但这在 MySQL 或 MariaDB 中是不可能的:
# PSEUDOCODE! NOT VALID.
BEGIN;
INSERT INTO
base_class (data0, data1)
ALONG_WITH derived_class (base_ids, data2, data3)
SELECT d0, d1, GET_ALONG_FIELD(base_class, id), d2, d3 FROM stuff
# _______ table 1 values
# _______________________________________ table 2 values
COMMIT;
如何在保持表格的“分层”设计的同时解决此问题?
编辑:
我再次提出这个问题是因为我很好奇是否有可能实现我想要的行为而不必求助于类似过程的 SQL 代码(使用游标)。
有没有办法在不使用游标的情况下解决这个问题?
【问题讨论】:
-
使用 MySQL 外部的脚本语言可能会容易得多。 Python、Ruby 甚至 NodeJS 都可以轻松处理这种递归。
-
@tadman:没错,最简单的解决方案是使用外部语言。但是,我真的很好奇这是否可以在纯 MySQL 中实现
标签: mysql sql database normalization mariadb