MySQL从2个源表插入到一个目标表
我在将两个表中的Id字段插入第三个表中的单个记录时遇到问题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 | +----------+------------------+------+-----+-
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)