我在使用一些 mysql 时遇到了一些问题。我会尽力提供更多背景知识。是这样的情况,我为我 parent 的植物苗圃创建了一个可用性并将植物信息存储在 mysql 中,我第一次做的很糟糕,现在我正在用同时获得的新知识重做它。
问题的背景,我在旧数据库中有 2 个表,一个称为 Gallery
,具有以下字段:
(id
, Plant_id_1
, Plant_id_2
, Plant_id_3
, Plant_id_4
, Plant_id_5
、Image1
、Image1_Copyright
、Image2
、Image2_Copyright
、Scientific
code>, Common
, Category
, Height
, Spread
, 曝光
, 区域
, Descp
).
Plant_id_1...
字段将是第二个表的 id
,该表称为 Availability
,具有以下字段:
(id
, name
, size
, description
, available
, 上线
, 价格
)
如您所见,我对数据集一无所知(可能仍然不知道),但对表格的新结构一无所知,同样是 2 个表格,第一个表格被称为 plants
,具有以下字段:
(id
, scientific_name
, common_name
, category
, height
, 传播
, 曝光
, usda
, description
, image1_url
, image1_copyright
code>, image2_url
, image2_copyright
)
第二个被称为 current
,具有以下字段:
(id
, plant_id
, size
, available
, upcoming
, 价格
, 描述
)
plant_id
将是 plant
表中相应植物的 ID。
现在开始讨论这个问题。我需要从旧表中获取数据并将其放入新表中。我在新的 plant
表中拥有图库中的所有植物,没有问题。但是现在要将 Availability
放入 Current
表中。
这是导出Availability
的示例(我取了前 3 名):
INSERT INTO `Availability` (`id`, `name`, `size`, `description`,`available`, `upcomming`, `price`) VALUES(91, 'Acer P.''Shishigashira''', ' #5', '30-36"', 27, 0, 36.00);
INSERT INTO `Availability` (`id`, `name`, `size`, `description`, `available`,`upcomming`, `price`) VALUES(697, 'Arbutus U. ''Compacta''', ' #5','', 0, 0, 16.20);
INSERT INTO `Availability` (`id`, `name`, `size`, `description`, `available`, `upcomming`, `price`) VALUES(90, 'Acer P.''Shigitatsusawa''', '#15', '', 0, 0, 65.00);
我需要从植物表中获取 plant_id
并将其放入插入语句中,我相信我有以下内容:
INSERT INTO `current` (`plant_id`, `size`,`description`, `available`, `upcoming`, `price`) VALUES(
(SELECT `id`
FROM `plants`
WHERE `scientific_name`
REGEXP 'Acer P.+ ''Shishigashira'''), ' #5', '30-36"', 27, 0, 36.00);
但现在我有一个新问题,如果 plant
表中没有匹配的植物怎么办,所以我需要一个 ifnull 在那里。以科学名称创建植物,其余为空。好吧,我是 SQL 的新手,所以这就是我所拥有的,但它不起作用:
INSERT INTO `current` (`plant_id`, `size`,`description`, `available`, `upcoming`, `price`) VALUES(
(IFNULL( SELECT IFNULL( (SELECT `id`
FROM `plants`
WHERE `scientific_name`
REGEXP 'Chamaecyparis O.+ Nana'),(
INSERT INTO `plants` (`scientific_name`)
VALUES (Chamaecyparis O. 'Nana'))))), ' #1', '', 0, 0, 9.25);
如您所见,如果您认为自己能够应对帮助我的挑战,这非常复杂,我将不胜感激。如果没有人能帮助我,我将不得不手动将所有数据重新输入到 current
表中。
最佳答案
您应该努力实现一个返回您需要插入到新表中的数据的选择。一次 你有你可以简单地将它包装到一个 INSERT INTO - SELECT 结构中。这样您就不必导出和单独插入。您可以一次性复制整个集合。
如果您确保当您将植物从画廊复制到植物表中时,id 保持不变,我希望这样的选择应该返回您想要插入的行:
SELECT
Gallery.id as plant_id,
Availability.size,
Availability.available,
Availability.upcoming,
Availability.price,
Availability.description
FROM Gallery
INNER JOIN Availability
ON Gallery.Plant_id1 = Availability.id
然后你可以在改变
的地方做同样的事情 5 次ON Gallery.Plant_id1 = Availability.id
到(一个接一个)
ON Gallery.Plant_id2 = Availability.id
ON Gallery.Plant_id3 = Availability.id
ON Gallery.Plant_id4 = Availability.id
ON Gallery.Plant_id5 = Availability.id
或者你把它们全部放在一个巨大的 sql 语句中,每个 select 之间有一个 UNION ALL
关于mysql IFNULL INSERT 巨大挫折?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7259901/