MySQL 从 2 个源 table 插入到一个目标 table

MySQL Insert from 2 source tables to one destination table

我在将两个 table 中的 ID 字段插入第三​​个 table 中的单个记录时遇到问题。

mysql> describe ing_titles;
+----------+------------------+------+-----+---------+----------------+
| Field    | Type             | Null | Key | Default | Extra          |
+----------+------------------+------+-----+---------+----------------+
| ID_Title | int(10) unsigned | NO   | PRI | NULL    | auto_increment |
| title    | varchar(64)      | NO   | UNI | NULL    |                |
+----------+------------------+------+-----+---------+----------------+
2 rows in set (0.22 sec)

mysql> describe ing_categories;
+-------------+------------------+------+-----+---------+----------------+
| Field       | Type             | Null | Key | Default | Extra          |
+-------------+------------------+------+-----+---------+----------------+
| ID_Category | int(10) unsigned | NO   | PRI | NULL    | auto_increment |
| category    | varchar(64)      | NO   | UNI | NULL    |                |
+-------------+------------------+------+-----+---------+----------------+
2 rows in set (0.02 sec)

mysql> describe ing_title_categories;
+-------------------+------------------+------+-----+---------+----------------+
| Field             | Type             | Null | Key | Default | Extra          |
+-------------------+------------------+------+-----+---------+----------------+
| ID_Title_Category | int(10) unsigned | NO   | PRI | NULL    | auto_increment |
| ID_Title          | int(10) unsigned | NO   | MUL | NULL    |                |
| ID_Category       | int(10) unsigned | NO   | MUL | NULL    |                |
+-------------------+------------------+------+-----+---------+----------------+
3 rows in set (0.04 sec)   

假设来自 table 的数据是:

mysql> select * from ing_titles;
+----------+-------------------+
| ID_Title | title             |
+----------+-------------------+
|        3 | Chicken           |
|        2 | corn              |
|        1 | Fettucini Alfredo |
+----------+-------------------+
3 rows in set (0.00 sec)

mysql> select * from ing_categories;
+-------------+----------+
| ID_Category | category |
+-------------+----------+
|           1 | Dinner   |
|           3 | Meat     |
|           2 | Veggie   |
+-------------+----------+
3 rows in set (0.00 sec)  

我想插入 ing_title_categories 记录 "corn, Veggie" 或者 ID_Title = 2 和 ID_Category = 2.

这是我的尝试:

INSERT INTO ing_title_categories (ID_Title, ID_Category)
SELECT ing_titles.ID_Title, ing_categories.ID_Category
FROM ing_title_categories
    LEFT JOIN ing_titles ON ing_title_categories.ID_Title=ing_titles.ID_Title
    LEFT JOIN ing_categories ON ing_title_categories.ID_Category=ing_categories.ID_Category
WHERE (ing_titles.ID_Title=2) AND (ing_categories.ID_Category = 2);

没有数据插入 table ing_title_categories,这里是 MySQL 的回复:

Query OK, 0 rows affected (0.00 sec)
Records: 0  Duplicates: 0  Warnings: 0

ing_titles.ID_Titleing_categories.ID_Category 插入 table ing_titles_categories 的正确语法是什么?

请不要使用 PHP 或 Python 示例。使用我可以复制并粘贴到 MySQL 提示符中的 SQL。我会将其添加到 C++ 程序中,而不是 PHP、JavaScript 或 Python.

编辑 1: ing_title_categories.ID_Titleing_title_categories.ID_Category 是其他 table 的外键。

在这种情况下,我看到的唯一可能方法是使用 UNION 查询,例如

INSERT INTO ing_title_categories (ID_Title, ID_Category)

SELECT Title, NULL
FROM ing_title WHERE ID_Title = 2

UNION

SELECT NULL, category
FROM ing_categories
WHERE ID_Category = 2

(或)

您可以更改 table 设计并使用 AFTER INSERT 触发器一次性执行相同的操作。

编辑:

如果您可以将 table 设计更改为如下所示(不需要额外的链接 table)

ing_titles(ID_Title int not null auto_increment PK, title varchar(64) not null);

ing_categories( ID_Category int not null auto_increment PK,  
category varchar(64) not null, 
ing_titles_ID_Title int not null, 
FOREIGN KEY (ing_titles_ID_Title) 
        REFERENCES ing_titles(ID_Title));

然后您可以使用 AFTER INSERT 触发器并像

那样进行插入
DELIMITER //

CREATE TRIGGER ing_titles_after_insert
AFTER INSERT
   ON ing_titles FOR EACH ROW

BEGIN


   -- Insert record into ing_categories table
   INSERT INTO ing_categories
   ( category,
     ing_titles_ID_Title)
   VALUES
   ('Meat' NEW.ID_Title);

END; //

DELIMITER ;
INSERT INTO
    ing_title_categories (ID_Title, ID_Category)
SELECT
    ing_titles.ID_Title, ing_categories.ID_Category
FROM
    ing_titles, ing_categories
WHERE
    ing_titles.ID_Title = ing_categories.ID_Category AND
    ing_titles.ID_Title = 2 AND ing_categories.ID_Category = 2;

SQL Fiddle demo

听取@DrewPierce 和@KaiserM11 的建议后,MySQL 序列如下:

mysql> INSERT INTO ing_title_categories (ID_Title, ID_Category)
    -> SELECT
    ->     ing_titles.ID_Title,
    ->     ing_categories.ID_Category
    -> FROM ing_titles, ing_categories
    -> where (ing_titles.ID_Title = 2) AND (ing_categories.ID_Category = 2)
    -> ;
Query OK, 1 row affected (0.07 sec)
Records: 1  Duplicates: 0  Warnings: 0

mysql> select * from ing_title_categories;
+-------------------+----------+-------------+
| ID_Title_Category | ID_Title | ID_Category |
+-------------------+----------+-------------+
|                17 |        2 |           2 |
+-------------------+----------+-------------+
1 row in set (0.00 sec)