更新集=选择声明&主要关键问题

时间:2011-08-15 17:55:09

标签: mysql sql

我有一张桌子:

TRADESHOW
id
name
industry

行业目前被列为行业的文本名称(软件,硬件,网络等)。我正在考虑将行业转移到一个单独的表中,这似乎是一个更好的设计,也使我的应用程序添加或编辑不同行业的数据更加一致和容易。新表将是:

INDUSTRY
id
name

TRADESHOW.industry将成为TRADESHOW.industry_id

我的问题:

  1. 这种变化有意义吗? IND enter code here USTRY表是否应该具有代理键(INDUSTRY.id),或者INDUSTRY.name的一列是否更有意义作为主键?

  2. 在实现TRADESHOW表后,形成UPDATE语句以修复INDUSTRY表的最佳方法是什么?我想我需要UPDATE SELECT声明?假设保留行业的代理关键是有意义的,我想的是:

  3. ...

    UPDATE tradeshow SET tradeshow.industry =
    (SELECT id FROM industry WHERE tradeshow.industry=industry.name)
    

    那会有用吗? (我知道它不会是完美的,因为行业名称现在不是100%一致。)有更好的方法吗?谢谢!

4 个答案:

答案 0 :(得分:1)

  1. 你肯定应该有一个行业表,这是基于第三范式的良好设计实践,主键可以是一个ID(就像你有)。 TRADESHOW表将indsutry_id作为FK,Name也会成为一个好主键,但通常当有很多FK引用时,存储会变大。

  2. 现在的方式,如果您的INDUSTRY表中有两个具有相同行业名称的记录,它将无法工作。我假设您从现有的TRADESHOW表填充表格?在这种情况下,您将执行SELECT UNIQUE行业来创建INDUSTRY表,因此它应该是唯一的。然后,您可以运行第一次填充的更新查询。

答案 1 :(得分:1)

这对我有用:

UPDATE appm_personnel SET appm_personnel.`PASSWORD`=(
   SELECT authorise.authorise_pass
   FROM authorise 
   WHERE authorise.authorise_idcard = appm_personnel.ID_CODE LIMIT 1 )
WHERE LENGTH(appm_personnel.ID_CODE)=13

答案 2 :(得分:0)

如果对于相同的Id,在TradeShow中您有多个行业的名称,那么为行业寻找不同的表是有意义的。如果你决定继续为Industry提供一个单独的表,我建议在TradeShow表中使用Industry_Id而不是Industry_Name

TradeShow
Id
Name
IndustryId

Industry
Id
Name

记住这一点,您的更新声明将是

Update TradeShow
Set Tradeshow.IndustryId = (Select Id From Industry where Name = 'abs')
Where TradeShow.Id = 12

其中Industry.Name和TradeShow.Id是输入

答案 3 :(得分:0)

  1. 是的,这是有道理的。但请考虑一下你是否真的需要这种规范化。如果它对你有意义,那就应该完成。 关于pk:通常,始终使用id主键以获得更好的性能和一致性。删除它几乎没有任何好处。

  2. 接缝几乎正确:

    ALTER to add tradeshow.industry_id
    UPDATE tradeshow SET tradeshow.industry_id =
    (SELECT id FROM industry WHERE tradeshow.industry=industry.name)
    ALTER to remove tradeshow.industry