【问题标题】:mysql IFNULL INSERT huge setback?mysql IFNULL INSERT 大挫折?
【发布时间】:2011-08-31 16:02:34
【问题描述】:

我对某些 mysql 有点问题。我会尽量提供更多的背景信息。情况就是这样,我为我父母的苗圃创建了一个可用性并将植物信息存储在 mysql 中,我第一次做得很糟糕,现在我正在用我同时获得的新知识重做它。

问题的背景,我在旧数据库中有 2 个表,其中一个名为 Gallery,具有以下字段:

(id, Plant_id_1, Plant_id_2, Plant_id_3, Plant_id_4, Plant_id_5, Image1, Image1_Copyright, Image2, @987654332,@, @987654332 @、CategoryHeightSpreadExposureZoneDescp)。

Plant_id_1... 字段将是名为 Availability 的第二个表的 id,具有以下字段:

(id, name, size, description, available, upcomming, price)

如您所见,我对数据一无所知(仍然可能不知道),但对表的新结构一无所知,还有 2 个表,第一个表被称为 plants,具有以下字段:

(id, scientific_name, common_name, category, height, spread, exposure, usda, description, @9876546361,@, @89 @,image2_copyright)

第二个被称为current,具有以下字段:

(id, plant_id, size, available, upcoming, price, description)

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 表中。

【问题讨论】:

  • 您在新植物表中的 id 是否与旧画廊表中的 id 匹配?我有点迷茫,为什么你认为你必须根据科学名称进行搜索,以及自从你说你复制了所有不同的植物后,这怎么可能是空的。那怎么会突然出现不知名的植物呢?
  • 我希望,它返回 null 的原因并不是所有可用的植物都在画廊中。所以我想做的是在植物画廊中创建那些缺失的植物。

标签: mysql sql ifnull


【解决方案1】:

您应该努力选择返回您需要插入到新表中的数据。一次 你有你可以简单地将它包装到一个 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 语句中,每个选择之间都有一个 UNION ALL

【讨论】:

  • 尝试了你的建议,我收到了这个错误,我想我明白了你的意思,但从“画廊”到“植物”表的 ID 不一样。 #1064 - 您的 SQL 语法有错误;检查与您的 MySQL 服务器版本相对应的手册,以在第 11 行的“ON Gallery.Plant_id2 = Availability.id ON Gallery.Plant_id3 = Availability.id ON”附近使用正确的语法
  • 好的,我明白了,所以我运行了您给我的内容,必须进行更改。 ON Gallery.Plant_id1 = Availability.id 到 ON Gallery.Plant_id_1 = Availability.id。注意plant_id 后面的下划线。我明白您的建议,它会按您的预期返回,但就像我说的那样,ID 不会保持不变。谢谢,现在我有另一条路要走。我会做更多的研究。
  • 感谢您,我的问题已解决。我完全按照你说的做了。我使用原始 ID 重新导入植物数据库,然后运行上面的命令以获取我需要的数据,然后将其导出为 csv 并将其导入当前表。非常感谢你。我已经用了 3 天了。
猜你喜欢
  • 2011-02-24
  • 1970-01-01
  • 2011-09-02
  • 1970-01-01
  • 2011-03-14
  • 2011-01-19
  • 1970-01-01
  • 2011-01-09
  • 1970-01-01
相关资源
最近更新 更多