mysql - 更新集 = 选择语句 & 主键问题

标签 mysql sql

我有一张 table :

TRADESHOW
id
name
industry

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

INDUSTRY
id
name

TRADESHOW.industry 将变为 TRADESHOW.industry_id

我的问题:

  1. 这个改变有意义吗?如果 IND在此处输入代码USTRY 表甚至具有代理键 (INDUSTRY.id),或者 INDUSTRY.name 的一列更有意义作为主键?

  2. 在实现 INDUSTRY 表后,形成 UPDATE 语句来修复 TRADESHOW 表的最佳方式是什么?我想我需要一个带有 SELECT 语句的 UPDATE ?假设在行业中保留代理键是有意义的,我的想法如下:

..

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

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

最佳答案

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

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

关于mysql - 更新集 = 选择语句 & 主键问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7068603/

相关文章:

sql - 如何查找哪些索引和约束包含特定列?

mysql - 创建13行31列的表结构

mysql - 在计数中仅包含一次 NULL

android - 为 Android 应用程序托管 MySQL 数据库选项

mysql - docker - 如何将mysql数据从本地迁移到ec2实例

mysql - MySQL中相交的替代方案

php - 根据wordpress的id获取数据

sql - SQLPLUS 中的 to_char 函数

mysql - Homebrew - 无法安装Sphinx

MySQL - 为每组日期选择最大日期