更新一个表中与其他表

时间:2016-03-23 09:41:52

标签: mysql sql

这个问题一直困扰着我。假设我有一个数据库模式如下:

股票( ID ,Book_ID,Meat_ID,Drink_ID)

预订( Book_ID ,Book_Title,Book_Price,Book_Rating)

食物( Food_ID ,Food_Name,Food_Price)

饮料( Drink_ID ,Drink_Name,Drink_Price,Drink_Rarity)

包含除Book_ID,Meat_ID,Drink_ID之外的所有字段的平面文件表:
FullData( ID ,Book_Title,Book_Price,Book_Rating,Food_Name,Food_Price,Drink_Name,Drink_Price,Drink_Rarity)

如何使用书本,食物和饮料表中与平面文件数据表相关的ID更新Stock表格?也就是说,让股票表以跟踪三个ID的方式(希望坚持3NF)?

例如: 书行:

5, "Harry Potter", $10.00, 4

食物行:

2, "Beef", $5.00

喝酒行:

7, "Cola", $3.00, common

平面文件行:

10, "Harry Potter", $10.00, 4, Beef, $5.00, "Cola", $3.00, common

股票行,它结合了三个:

10, 5, 2, 7

我尝试过使用INSERT INTO或UPDATE语句,但如果它们是正确的方法,我会感到困惑。我也想知道这是否也是错误的架构设计。

1 个答案:

答案 0 :(得分:0)

我假设您已经将bookfooddrink条目插入到各自的表中。

在这种情况下,你可以这样做:

INSERT INTO stock (book_id, meat_id, drink_id) 
SELECT (select b.id from book b where b.name = ff.book_title),
       (select f.id from food f where f.name = ff.food_name),
       (select d.id from drink d where d.name == ff.drink_name)
  FROM <flat_file_table> ff;

如果找不到任何记录或给定null的可能name值,则可以使用join子句。这将仅获取not null子句中的SELECT值。像这样:

INSERT INTO stock (book_id, meat_id, drink_id) 
SELECT b.id, f.id, d.id
  FROM <flat_file_table> ff 
  JOIN book b ON ff.book_title = b.name 
  JOIN food f ON ff.food_name = f.name
  JOIN drink d ON ff.drink_name = d.name;