【问题标题】:MySQL: Determine Table's Primary Key DynamicallyMySQL:动态确定表的主键
【发布时间】:2010-10-27 23:46:05
【问题描述】:

我在 PHP 中生成这样的 SQL 查询:

$sql = sprintf("UPDATE %s SET %s = %s WHERE %s = %s", ...);

由于这个查询的几乎每个部分都是动态的,我需要一种方法来动态确定表的主键,这样我就有这样的查询:

$sql = sprintf("UPDATE %s SET %s=%s WHERE PRIMARY_KEY = %s", ...);

表的主键是否有 MySQL 关键字,或获取它的方法?

我以前使用 information_schema 数据库来查找此类信息,但如果我不必求助于它,那就太好了。

【问题讨论】:

    标签: php sql mysql primary-key


    【解决方案1】:
    SHOW INDEX FROM <tablename>
    

    您想要 Key_name = PRIMARY 的行

    http://dev.mysql.com/doc/refman/5.0/en/show-index.html

    您可能希望缓存结果——在您可能需要使用的所有表上运行 SHOW 语句需要一段时间。

    【讨论】:

    • 谢谢,太好了。我最终使用了这个:SHOW KEYS FROM WHERE Key_name = 'PRIMARY'
    • 这将返回整行...如果您只需要列名,请参阅下面 Jake Sully 的回答。
    • 作为撰写此答案的人,我不得不同意:Jake Sully 的答案是迄今为止最好的答案。 @macinjosh 我建议不接受我的答案,而是接受杰克的答案。
    【解决方案2】:

    可能不建议这样做,但效果很好:

    SHOW INDEX FROM <table_name> WHERE Key_name = 'PRIMARY';
    

    可靠的方法是使用information_schema:

    SELECT k.COLUMN_NAME
    FROM information_schema.table_constraints t
    LEFT JOIN information_schema.key_column_usage k
    USING(constraint_name,table_schema,table_name)
    WHERE t.constraint_type='PRIMARY KEY'
        AND t.table_schema=DATABASE()
        AND t.table_name='owalog';
    

    mysql-list 所示。然而,它比第一个解决方案慢了几倍。

    【讨论】:

    • 您好,我知道这是一篇旧帖子,但我只是想问一下您为什么说不建议使用第一种方法。 this duplicate question 接受的答案说您并不总是可以访问 information_schema,因此它建议使用第一种方法。另外,您自己说第二种方法比第一种解决方案慢几倍。如果是这样,为什么第二种方法是可靠的?谢谢。
    • 正如mysql-0v34c10ck.blogspot.com/2011/05/… 中指出的那样,它不能用作mysql 变量或认为视图等,但如果第一种情况适用于您的场景,那就去吧@Andrew
    【解决方案3】:

    获取主键列的更好方法:

    SELECT `COLUMN_NAME`
    FROM `information_schema`.`COLUMNS`
    WHERE (`TABLE_SCHEMA` = 'dbName')
      AND (`TABLE_NAME` = 'tableName')
      AND (`COLUMN_KEY` = 'PRI');
    

    来自http://mysql-0v34c10ck.blogspot.com/2011/05/better-way-to-get-primary-key-columns.html

    【讨论】:

      【解决方案4】:

      还有

      SHOW INDEX FROM <table_name> WHERE Key_name = 'PRIMARY';
      

      相当于

      SHOW KEYS FROM <table_name> WHERE Key_name = 'PRIMARY';
      

      【讨论】:

        【解决方案5】:

        根据@jake-sully 和@lukmdo 的回答,合并他们的代码,我完成了以下sn-p:

        SELECT `COLUMN_NAME`
        FROM `information_schema`.`COLUMNS`
        WHERE (`TABLE_SCHEMA` = DATABASE())
        AND (`TABLE_NAME` = '<tablename>')
        AND (`COLUMN_KEY` = 'PRI');
        

        希望它可以帮助某人

        【讨论】:

          猜你喜欢
          • 2010-12-04
          • 2011-10-16
          • 2016-09-16
          • 2013-07-23
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2011-08-12
          相关资源
          最近更新 更多