【问题标题】:How to insert Primary Key value of the primary table to the Foreign Key column of the child table in MySQL?MySQL如何将主表的Primary Key值插入到子表的Foreign Key列中?
【发布时间】:2016-11-12 16:29:44
【问题描述】:

您好,我是 PHP 和 MYSQL 的初学者。我做了两张桌子。主表“客户”是:

id | name  |  place  |  email
 1   bob      berlin   bob@bob.com
 2   kary     dresden  kary@kary.com
 3   sam      zurich   sam@sam.com

“menu_id”是外键的子表“orders”是:

id  | menu_name | menu_id | date_of_order
 1    sandwich       2       2016-05-03
 2    fruits         3       2016-05-02
 3    pizza          1       2016-05-04
 4    salad          1       2016-05-06

现在通过一个简单的 LEFT JOIN,我可以查看哪个客户在哪个日期下的订单。

但问题是,如果在我的“客户”表中添加新用户,我无法将其“id”作为外键插入到“menu_id”列中。

之后假设我这样做了

INSERT INTO customers (name, place, email) VALUES ('joe', 'melbourne', 'joe@xyz.com')

在我的订单表中

INSERT INTO orders(menu_name, menu_id, date_of_order)
VALUES('pizza', 'SELECT id FROM customers WHERE email = joe@xyz.com', '2016-05-09')

在此之后,“订单”表看起来像

id  | menu_name | menu_id | date_of_order
 1    sandwich       2       2016-05-03
 2    fruits         3       2016-05-02
 3    pizza          1       2016-05-04
 4    salad          1       2016-05-06
 5    pizza          0       2016-05-09

“订单”表中的 menu_id 应该显示“4”而不是 0。我也尝试过 LAST_INSERT_ID(),但它得到的值仍然是 0。我不知道为什么会这样。请帮忙

【问题讨论】:

  • 如果你不给我们看一些代码,就很难猜出哪里出了问题。
  • 在“客户”表中,我将客户(姓名、地点、电子邮件)值(“joe”、“new_york”、“joe@joe.com”)插入到订单表中我在订单中插入(menu_name、menu_id、date_of_order)值('pizza'、'SELECT id FROM customer where email ='joe@joe.com'、'2016-05-09')
  • 点击问题下方的编辑以在此处添加相关代码。 cmets 中的代码几乎不可读。
  • 完成@Jocelyn 请立即查看

标签: mysql database foreign-keys


【解决方案1】:

你的问题是你做错了

INSERT INTO orders(menu_name, menu_id, date_of_order) VALUES('pizza', 'SELECT id FROM customers WHERE email = joe@xyz.com', '2016-05-09')

应该是

INSERT INTO `orders`(`menu_name`, `menu_id`, `date_of_order`) VALUES('pizza', (SELECT `id` FROM `customers` WHERE `email` = 'joe@xyz.com' limit 1), '2016-05-09');

所以你基本上试图插入 'SELECT id FROM customers WHERE email = joe@xyz.com' 作为字符串,它正在转换为 int(如果你有它作为 int)

创建语句:

CREATE TABLE `customers` (
    `id` int(11) NOT NULL AUTO_INCREMENT,
    `name` varchar(245) DEFAULT NULL,
    `place` varchar(245) DEFAULT NULL,
    `email` varchar(245) DEFAULT NULL,
    PRIMARY KEY (`id`)
)  ENGINE=InnoDB AUTO_INCREMENT=0 DEFAULT CHARSET=utf8;

CREATE TABLE `orders` (
    `id` int(11) NOT NULL AUTO_INCREMENT,
    `menu_name` varchar(245) DEFAULT NULL,
    `menu_id` int(11) DEFAULT NULL,
    `date_of_order` date DEFAULT NULL,
    PRIMARY KEY (`id`),
    KEY `FK orders menu_id  customer id_idx` (`menu_id`),
    CONSTRAINT `FK orders menu_id  customer id` FOREIGN KEY (`menu_id`)
        REFERENCES `customers` (`id`)
        ON DELETE SET NULL ON UPDATE NO ACTION
)  ENGINE=InnoDB AUTO_INCREMENT=0 DEFAULT CHARSET=utf8;

你插入:

INSERT INTO `customers` (`name`, `place`, `email`) VALUES ('bob', 'berlin', 'bob@bob.com');
INSERT INTO `customers` (`name`, `place`, `email`) VALUES ('kary', 'dresden', 'kary@kary.com');
INSERT INTO `customers` (`name`, `place`, `email`) VALUES ('sam', 'zurich', 'sam@sam.com');


INSERT INTO `orders`(`menu_name`, `menu_id`, `date_of_order`) VALUES('sandwich', (SELECT id FROM customers WHERE email = 'kary@kary.com' limit 1), '2016-05-09');
INSERT INTO `orders`(`menu_name`, `menu_id`, `date_of_order`) VALUES('fruits', (SELECT id FROM customers WHERE email = 'sam@sam.com' limit 1), '2016-05-09');
INSERT INTO `orders`(`menu_name`, `menu_id`, `date_of_order`) VALUES('pizza', (SELECT id FROM customers WHERE email = 'bob@bob.com' limit 1), '2016-05-09');
INSERT INTO `orders`(`menu_name`, `menu_id`, `date_of_order`) VALUES('salad', (SELECT id FROM customers WHERE email = 'bob@bob.com' limit 1), '2016-05-09');


INSERT INTO `customers` (`name`, `place`, `email`) VALUES ('joe', 'melbourne', 'joe@xyz.com');
INSERT INTO `orders`(`menu_name`, `menu_id`, `date_of_order`) VALUES('pizza', (SELECT id FROM customers WHERE email = 'joe@xyz.com' limit 1), '2016-05-09');

和结果

mysql> select * from customers;
+----+------+-----------+---------------+
| id | name | place     | email         |
+----+------+-----------+---------------+
|  1 | bob  | berlin    | bob@bob.com   |
|  2 | kary | dresden   | kary@kary.com |
|  3 | sam  | zurich    | sam@sam.com   |
|  4 | joe  | melbourne | joe@xyz.com   |
+----+------+-----------+---------------+
4 rows in set (0.02 sec)

mysql> select * from orders;
+----+-----------+---------+---------------+
| id | menu_name | menu_id | date_of_order |
+----+-----------+---------+---------------+
|  1 | sandwich  |       2 | 2016-05-09    |
|  2 | fruits    |       3 | 2016-05-09    |
|  3 | pizza     |       1 | 2016-05-09    |
|  4 | salad     |       1 | 2016-05-09    |
|  5 | pizza     |       4 | 2016-05-09    |
+----+-----------+---------+---------------+
5 rows in set (0.02 sec)

【讨论】:

  • 为什么没有选择答案?
  • 是的,你的答案就是。如何“选择”它?
  • 是的。非常抱歉,因为我是这个网站的新手。我现在正在阅读它。给您带来的不便深表歉意。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-12-15
  • 2012-02-08
  • 2012-11-20
  • 2011-04-20
相关资源
最近更新 更多