【问题标题】:How to get primary key of table?如何获取表的主键?
【发布时间】:2011-01-21 10:15:26
【问题描述】:

有没有办法从 mysql-database 获取主键字段的名称?例如:

我有一张这样的桌子:

+----+------+
| id | name |
+----+------+
| 1  | Foo1 |
| 2  | Foo2 |
| 3  | Foo3 |
+----+------+

字段 id 是主键(它具有自动增量,但我不能使用它)。如何在 php 中检索字段名称“id”?

【问题讨论】:

    标签: php mysql primary-key


    【解决方案1】:

    更好的方法是使用SHOW KEYS,因为您并不总是可以访问information_schema。以下作品:

    SHOW KEYS FROM table WHERE Key_name = 'PRIMARY'
    

    Column_name 将包含主键的名称。

    【讨论】:

    • 好建议。从 MySQL 5.0 开始支持 information_schema,但实际上这种方法也适用于更旧的版本。
    • 有没有办法只检索column_name 键?
    • 如果您只想获取列名,请使用cut:` |剪切-f5`
    • 这种方法对 information.schema 有什么可能的缺点吗?这是一个可以在各种 SQL 服务器、MySQL/MariaDb 等上运行的插件
    • @alexn 有没有办法用一个命令显示所有表的主键?
    【解决方案2】:

    这里是主键列名

    SELECT k.column_name
    FROM information_schema.table_constraints t
    JOIN information_schema.key_column_usage k
    USING(constraint_name,table_schema,table_name)
    WHERE t.constraint_type='PRIMARY KEY'
      AND t.table_schema='YourDatabase'
      AND t.table_name='YourTable';
    

    【讨论】:

    • 是的 - 这是一种方式。在 MySQL 的情况下,您甚至可以简化这一点,因为 constraint_name 将始终为 PRIMARY
    • 根本不会推荐这个,因为它需要 alexn 的答案要快得多
    • 是的,这个查询需要很长时间。我所做的是另一个带有表名和表 id 的表,并尝试从那里获取,如果它找不到表,所以它会进行这个长查询并将其添加到新表中,工作得更快。但是alexn的回答似乎也很好
    • 但是这个解决方案在处理多个表时效果很好。 (只需选择 k.table_name、k.column_name、k.ordinal_position)。
    【解决方案3】:
    SELECT kcu.column_name, kcu.ordinal_position
    FROM   information_schema.table_constraints tc
    INNER JOIN information_schema.key_column_usage kcu
    ON     tc.CONSTRAINT_CATALOG = kcu.CONSTRAINT_CATALOG
    AND    tc.CONSTRAINT_SCHEMA = kcu.CONSTRAINT_SCHEMA
    AND    tc.CONSTRAINT_NAME = kcu.CONSTRAINT_NAME
    WHERE  tc.table_schema = schema()             -- only look in the current schema
    AND    tc.constraint_type = 'PRIMARY KEY'
    AND    tc.table_name = '<your-table-name>'    -- specify your table.
    ORDER BY kcu.ordinal_position
    

    【讨论】:

    • 仅供参考,在 sqlserver 上,constraint_name 看起来像 UK_entity_namePK_UsersFK_Users_Contacts 等,所以看起来不可能信任具有众所周知的与平台无关的价值。 ?
    • 哇!我没想到你会更新它。 ? 除了几件事,它完美无缺! (我用修复更新了你的答案,希望你不介意)
    • @Christian 感谢快速跟进和更正。非常感谢!
    • 对我来说,这不适用于旧的 mysql 5.5,改为这个SELECT kcu.column_name, kcu.ordinal_position FROM information_schema.table_constraints tc INNER JOIN information_schema.key_column_usage kcu ON tc.TABLE_SCHEMA = kcu.TABLE_SCHEMA AND tc.TABLE_NAME = kcu.TABLE_NAME AND tc.CONSTRAINT_NAME = kcu.CONSTRAINT_NAME WHERE tc.table_schema = schema() -- only look in the current schema AND tc.constraint_type = 'PRIMARY KEY' AND tc.table_name = 'logins' -- specify your table. ORDER BY kcu.ordinal_position
    • 需要在WHERE上方加AND tc.TABLE_NAME = kcu.TABLE_NAME
    【解决方案4】:

    使用:

    show columns from tablename where `Key` = "PRI";
    

    【讨论】:

    • 这对我来说效果最好,因为我不必访问信息架构(它不可用),我可以动态地从字段列中获取键。
    【解决方案5】:

    这个怎么样:

    SELECT COLUMN_NAME
    FROM INFORMATION_SCHEMA.COLUMNS
    WHERE TABLE_SCHEMA = 'Your Database'
      AND TABLE_NAME = 'Your Table name'
      AND COLUMN_KEY = 'PRI';
    
    
    SELECT COLUMN_NAME
    FROM INFORMATION_SCHEMA.COLUMNS
    WHERE TABLE_SCHEMA = 'Your Database'
      AND TABLE_NAME = 'Your Table name'
      AND COLUMN_KEY = 'UNI';
    

    【讨论】:

    • 错误 1054 (42S22):'where 子句'中的未知列 'db'
    • @zloctb:用你的 TABLE_SCHEMA 重命名db 怎么样...?我不明白你为什么对此 +1...
    • 这是最清晰的答案,并且立即为我工作。
    【解决方案6】:

    如果您想一次性通过 PHP 动态生成主键列表,而不必遍历您可以使用的每个表

    SELECT TABLE_NAME, COLUMN_NAME
    FROM INFORMATION_SCHEMA.key_column_usage 
    WHERE table_schema = '$database_name' AND CONSTRAINT_NAME = 'PRIMARY' 
    

    尽管您确实需要访问 information.schema 才能执行此操作。

    【讨论】:

      【解决方案7】:

      尽可能短的代码似乎类似于

      // $dblink contain database login details 
      // $tblName the current table name 
      $r = mysqli_fetch_assoc(mysqli_query($dblink, "SHOW KEYS FROM $tblName WHERE Key_name = 'PRIMARY'")); 
      $iColName = $r['Column_name']; 
      

      【讨论】:

        【解决方案8】:

        对于 PHP 方法,您可以使用 mysql_field_flags

        $q = mysql_query('select * from table limit 1');
        
        for($i = 0; $i < mysql_num_fields(); $i++)
            if(strpos(mysql_field_tags($q, $i), 'primary_key') !== false)
                echo mysql_field_name($q, $i)." is a primary key\n";
        

        【讨论】:

        • 是的,好建议。虽然有限,但这对于主键来说已经足够了。
        • 提问者说的是 PHP。
        【解决方案9】:

        我终于明白了!

        <?php
        
        function mysql_get_prim_key($table){
            $sql = "SHOW INDEX FROM $table WHERE Key_name = 'PRIMARY'";
            $gp = mysql_query($sql);
            $cgp = mysql_num_rows($gp);
        
            if ($cgp > 0) {
                // Note I'm not using a while loop because I never use more than one prim key column
                $agp = mysql_fetch_array($gp);
                extract($agp);
                
                return($Column_name);
            } else {
                return(false);
            }
        }
        
        ?>
        

        【讨论】:

          【解决方案10】:

          我使用 SHOW INDEX FROM 表;它给了我很多信息;如果键是唯一的,它在索引中的序列,排序规则,子部分,如果为空,它的类型和注释如果存在,请参见截图

          【讨论】:

          • 能否请您详细说明您的答案,添加更多关于您提供的解决方案的描述?
          【解决方案11】:

          MySQL 有一个 SQL 查询“SHOW INDEX FROM”,它从表中返回索引。 例如。 - 以下查询将显示产品表的所有索引:-

          SHOW INDEXES FROM products \G
          

          它返回一个包含类型、column_name、Key_name 等的表,并将所有索引和主键的输出显示为 -

          *************************** 1. row ***************************
                  Table: products
             Non_unique: 0
               Key_name: PRIMARY
           Seq_in_index: 1
            Column_name: product_id
              Collation: A
            Cardinality: 0
               Sub_part: NULL
                 Packed: NULL
                   Null: 
             Index_type: BTREE
                Comment: 
          Index_comment: 
          

          要仅显示表中的主键,请使用:-

          SHOW INDEXES FROM table_name WHERE Key_name = 'PRIMARY'
          

          【讨论】:

          • 考虑添加解释,说明为什么这会回答原始问题。
          【解决方案12】:

          如果您的数据库中有空间表,请使用:

          SHOW KEYS FROM table WHERE Key_name = 'PRIMARY' OR Key_name = 'OGR_FID'
          

          【讨论】:

            【解决方案13】:

            你应该使用来自key_column_usage.constraint_name = "PRIMARY"的PRIMARY

            示例查询,

            SELECT k.column_name as PK, concat(tbl.TABLE_SCHEMA, '.`', tbl.TABLE_NAME, '`') as TABLE_NAME
            FROM information_schema.TABLES tbl
            JOIN information_schema.key_column_usage k on k.table_name = tbl.table_name
            WHERE k.constraint_name='PRIMARY'
              AND tbl.table_schema='MYDB'
              AND tbl.table_type="BASE TABLE";
            

            【讨论】:

              【解决方案14】:
              SELECT k.column_name
              FROM information_schema.key_column_usage k   
              WHERE k.table_name = 'YOUR TABLE NAME' AND k.constraint_name LIKE 'pk%'
              

              我建议你观看所有领域

              【讨论】:

                猜你喜欢
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                相关资源
                最近更新 更多