【问题标题】:How can I have a primary key in a VIEW (a key that doesn't depend on source tables)如何在 VIEW 中拥有主键(不依赖于源表的键)
【发布时间】:2009-12-28 22:09:00
【问题描述】:

我正在用 3 个 TABLES 创建一个 VIEW。每个 TABLE 都有它的主键。但是,在 VIEW 中为了有一个主键,我必须使用一个复合主键(3 个 TABLES 的主键组合)。

但是,我想在 VIEW 中添加一个列作为主键,该主键只是为了 VIEW 的目的而创建的。作为 VIEW 定义的一部分,它应该是 UNIQUE(自动增量,因为它主要是一个 INT)。我怎样才能做到这一点?

我使用的是 MySQL 5.1

【问题讨论】:

    标签: mysql primary-key


    【解决方案1】:

    使用投票最高的答案

    SELECT @rownum:=@rownum+1 as id, mytable.*
    FROM (SELECT @rownum:=0) r, mytable;
    

    不正确 - 您不能在 mysql 中创建使用 FROM 中的子选择的视图。您唯一的选择是将一组列视为复合键。

    【讨论】:

    • 而且MySQL不支持索引视图,所以只是在回答如何获取唯一ID。无论如何,+1 指出这一点。
    • 您甚至不能在将创建视图的选择中使用变量。同意,解决方案是复合键。
    【解决方案2】:

    视图没有主键或索引 - mysql 引擎将使用基表上定义的索引和键。

    【讨论】:

    • 你是对的。老实说,我的不是 PRIMARY 键的要求,而是 UNIQUE 键的要求。我现在正在连接三个键并从中制作一个 UNIQUE 键。
    【解决方案3】:

    视图只是一个存储的子查询。 PK的想法无关紧要。

    ...除非您需要索引视图,在这种情况下,您需要视图上的聚集索引(但仍不一定是主键)

    (虽然,我说的是 SQL Server...我不确定这如何转化为 MySQL)

    【讨论】:

      【解决方案4】:

      您可以使用各种方法将唯一 ID 插入到视图数据中,例如:

      SELECT @rownum:=@rownum+1 as id, mytable.*
      FROM (SELECT @rownum:=0) r, mytable;
      

      但是这不是主键,它是不一致的,会随着数据的变化而变化。

      你到底需要什么钥匙?

      【讨论】:

      • Paul,受到您的启发,我现在正在连接三个键并从中制作一个 UNIQUE 键。老实说,我的要求不是 PRIMARY 键,而是 UNIQUE 键。谢谢。
      • paul,例如,如果您将此应用于视图,它不一定会按顺序给您id。它给你一个唯一的标识符,但不是按顺序排列的。一个相当简单的解决方案是创建一个具有自动编号字段的临时表(例如,通过从视图中插入)。每次数据更改时都会强制您重新创建表,但这可以在 php 或 java 中轻松完成。
      • 正如 David Clifton 所说,您无法使用 SELECT @rownum:=@rownum+1 as id, mytable.* FROM (SELECT @rownum:=0) r, mytable; 创建视图,您将获得 1351 error
      猜你喜欢
      • 1970-01-01
      • 2016-08-17
      • 2019-07-21
      • 2015-02-26
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-12-14
      • 1970-01-01
      相关资源
      最近更新 更多