Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/61.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Mysql 更新集=选择语句&;主要关键问题_Mysql_Sql - Fatal编程技术网

Mysql 更新集=选择语句&;主要关键问题

Mysql 更新集=选择语句&;主要关键问题,mysql,sql,Mysql,Sql,我有一张桌子: TRADESHOW id name industry 其中行业当前列为行业的文本名称(软件、硬件、网络等)。我正在考虑将行业移动到一个单独的表中,这似乎是一个更好的设计,并且使数据更加一致,使我的应用程序更容易添加或编辑不同的行业。新的表格将是: INDUSTRY id name 而TRADESHOW.industry将成为TRADESHOW.industry\u id 我的问题是: 这种变化有意义吗?IND在此处输入代码USTRY表是否应该有一个代理键(INDUSTRY.i

我有一张桌子:

TRADESHOW
id
name
industry
其中行业当前列为行业的文本名称(软件、硬件、网络等)。我正在考虑将行业移动到一个单独的表中,这似乎是一个更好的设计,并且使数据更加一致,使我的应用程序更容易添加或编辑不同的行业。新的表格将是:

INDUSTRY
id
name
而TRADESHOW.industry将成为TRADESHOW.industry\u id

我的问题是:

  • 这种变化有意义吗?IND
    在此处输入代码
    USTRY表是否应该有一个代理键(
    INDUSTRY.id
    ),或者
    INDUSTRY.name的一列作为主键是否更有意义

  • 在实现
    行业
    表之后,形成更新语句以修复
    贸易展
    表的最佳方式是什么?我想我需要一个带有
    SELECT
    语句的
    UPDATE
    ?假设在行业中保留代理密钥是有意义的,我会这样想:


  • 这样行吗?(我知道这并不完美,因为现在的行业名称并非100%一致。)有更好的方法吗?谢谢

    如果在TradeShow中针对同一Id、名称有多个行业,则选择不同的行业表是有意义的。如果您决定为行业单独设置一个表,我建议在贸易展表中使用行业Id而不是行业名称

    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是输入

  • 您肯定应该有一个行业表,这是基于第三种范式的良好设计实践,主键可以是一个ID(就像您所拥有的那样)。TRADESHOW表将indsutry_id作为FK,名称也将成为一个很好的主键,但通常当有大量FK引用时,存储空间会变得很大

  • 按照现在的方式,如果您的行业表中有两条记录具有相同的行业名称,那么它将不起作用。我假设您是从现有的TRADESHOW表填充该表?在这种情况下,您将执行选择唯一行业来创建行业表,因此它应该是唯一的。然后,您可以运行您第一次使用的更新查询

  • 是的,这很有道理。但是,如果你真的需要这个规范化。如果你觉得有道理,就应该这样做。 关于pk:通常,要有一个id主键,以获得更好的性能和一致性。移除它几乎没有任何好处

  • 几乎正确的接缝:

    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
    
  • 这对我很有用:

    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
    
    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