在一个操作中填充 MySQL 记录一对多相关表

发布于 2024-12-05 10:23:13 字数 598 浏览 1 评论 0原文

我有两个 MySQL 表,它们之间具有一对多关系。例如:

CREATE TABLE test1 (
    pk1 INTEGER AUTO_INCREMENT PRIMARY KEY,
    testvalue1 INTEGER
);

CREATE TABLE test2 (
    pk2 INTEGER AUTO_INCREMENT PRIMARY KEY,
    testvalue2 VARCHAR(50),
    fk2 INTEGER NOT NULL,
    FOREIGN KEY (fk2) REFERENCES test1 (pk1)
);

如果我想在两个表中插入记录,我可以先在 PK 表中插入一条记录(例如 INSERT INTO test1 SET testvalue1=100),确定 PK 值(例如 SELECT MAX(pk1) AS LastId FROM test1 或使用 LAST_INSERT_ID()) 最后使用该值填充第二个表中的 FK 列。

但是是否有可能在 1 个命令/查询/操作中实现这一切?那么让 MySQL 使用自动增量来填充 PK 和 FK 值吗?

I have two MySQL tables with an one-to-many relationship between them. For example:

CREATE TABLE test1 (
    pk1 INTEGER AUTO_INCREMENT PRIMARY KEY,
    testvalue1 INTEGER
);

CREATE TABLE test2 (
    pk2 INTEGER AUTO_INCREMENT PRIMARY KEY,
    testvalue2 VARCHAR(50),
    fk2 INTEGER NOT NULL,
    FOREIGN KEY (fk2) REFERENCES test1 (pk1)
);

If I want to insert records in both tables I can first insert a record in the PK table (e.g. INSERT INTO test1 SET testvalue1=100), determine the PK value (e.g. SELECT MAX(pk1) AS LastId FROM test1 or use LAST_INSERT_ID())
and finally use that value to fill the FK column in the second table.

But is it possible to achieve this all in 1 command/query/action? So let's MySQL fill in the PK- and FK-values using the AUTO INCREMENTs?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

白云悠悠 2024-12-12 10:23:13

您应该使用两个 INSERT 命令;或者尝试使用 INSERT 触发器。

编辑:

--带有触发器的示例:

CREATE TABLE dept(
  id INT(11) NOT NULL AUTO_INCREMENT,
  dept_name VARCHAR(255) DEFAULT NULL,
  PRIMARY KEY (id)
)
ENGINE = INNODB;

CREATE TABLE emp(
  id INT(11) NOT NULL AUTO_INCREMENT,
  emp_name VARCHAR(255) DEFAULT NULL,
  dept_id INT(11) DEFAULT NULL,
  PRIMARY KEY (id),
  CONSTRAINT FK_emp_dept_id FOREIGN KEY (dept_id)
  REFERENCES dept (id) ON DELETE RESTRICT ON UPDATE RESTRICT
)
ENGINE = INNODB;

DELIMITER $

CREATE TRIGGER trigger1
AFTER INSERT
ON dept
FOR EACH ROW
BEGIN
  INSERT INTO emp VALUES (NULL, 'Someone', NEW.id);
END
$

DELIMITER ;


-- Try to add new department.
INSERT INTO dept VALUES(NULL, 'Sales');

-- Is there new default employee?
SELECT * FROM emp;
+----+----------+---------+
| id | emp_name | dept_id |
+----+----------+---------+
|  1 | Someone  |       1 |
+----+----------+---------+

You should use two INSERT commands; or try to use an INSERT-trigger.

EDIT:

--An example with trigger:

CREATE TABLE dept(
  id INT(11) NOT NULL AUTO_INCREMENT,
  dept_name VARCHAR(255) DEFAULT NULL,
  PRIMARY KEY (id)
)
ENGINE = INNODB;

CREATE TABLE emp(
  id INT(11) NOT NULL AUTO_INCREMENT,
  emp_name VARCHAR(255) DEFAULT NULL,
  dept_id INT(11) DEFAULT NULL,
  PRIMARY KEY (id),
  CONSTRAINT FK_emp_dept_id FOREIGN KEY (dept_id)
  REFERENCES dept (id) ON DELETE RESTRICT ON UPDATE RESTRICT
)
ENGINE = INNODB;

DELIMITER $

CREATE TRIGGER trigger1
AFTER INSERT
ON dept
FOR EACH ROW
BEGIN
  INSERT INTO emp VALUES (NULL, 'Someone', NEW.id);
END
$

DELIMITER ;


-- Try to add new department.
INSERT INTO dept VALUES(NULL, 'Sales');

-- Is there new default employee?
SELECT * FROM emp;
+----+----------+---------+
| id | emp_name | dept_id |
+----+----------+---------+
|  1 | Someone  |       1 |
+----+----------+---------+
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文