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

MySQL从2个源表插入到一个目标表,mysql,sql,insert,foreign-keys,left-join,Mysql,Sql,Insert,Foreign Keys,Left Join,我在将两个表中的Id字段插入第三个表中的单个记录时遇到问题 mysql> describe ing_titles; +----------+------------------+------+-----+---------+----------------+ | Field | Type | Null | Key | Default | Extra | +----------+------------------+------+-----+-

我在将两个表中的Id字段插入第三个表中的单个记录时遇到问题

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)   
假设表中的数据为:

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
中插入记录“玉米、蔬菜”或其中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);
没有数据插入表
ing\u title\u categories
,以下是MySQL的回复:

Query OK, 0 rows affected (0.00 sec)
Records: 0  Duplicates: 0  Warnings: 0
ing_titles.ID_Title
ing_categories.ID_categories
插入表
ing_titles\u categories
的正确语法是什么

请不要使用PHP或Python示例。使用我可以复制并粘贴到MySQL提示符中的SQL。我将把这个添加到C++程序中,而不是PHP、JavaScript或Python。 编辑1:
ing\u title\u categories.ID\u title
ing\u title\u categories.ID\u categories
是其他表中的外键

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

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
(或)

您可以更改表格设计,并在插入后使用
触发器一次性执行相同操作

编辑:

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

然后,您可以在插入后使用
触发器并执行类似的插入操作

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 ;

在听取@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)  

是的,
ing_titles
ing_categories
之间没有关系。我正在尝试将
ing_titles.ID_Title
ing_categories.ID_categories
放入
ing_Title_categories
表中的记录中。您的表设计使在链接表中插入数据变得困难。否则可以用触发器来完成。你有什么建议?我正在研究使用范式。我不想浪费空间复制类别或标题。标题与类别相关联。标题类别对表示成分的“标题”。两种名称相同但类别不同的成分被视为两种不同的成分。@ThomasMatthews。如果有帮助,请查看编辑后的答案。目标表
ing\u title\u categories
,包含以下字段:
ID\u title\u Category,ID\u title,ID\u categories
。表中没有
标题
类别
字段。以下是MySQL的错误:
错误1054(42S22):“字段列表”中的未知列“标题”
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;
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)