Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/274.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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/60.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
Php 在不知道字段名称的情况下选择主键值_Php_Mysql_Primary Key - Fatal编程技术网

Php 在不知道字段名称的情况下选择主键值

Php 在不知道字段名称的情况下选择主键值,php,mysql,primary-key,Php,Mysql,Primary Key,我有三个表,图像,图标,和横幅,每个表都有一个唯一的主键,主键也是自动递增的,分别命名为图像id,图标id,和横幅id 我正在浏览上面的表格,我想知道是否有一种方法可以选择id列而不指定它的特定名称 差不多 SELECT PRIMARY_KEY FROM {$table} 我不必更改我的表结构或使用*,因为会有很多数据要返回,并且会减慢我的应用程序的速度。只需命名每个表中的id列id。保留外键的任何id命名 或者您可以使用标准SQL命令 show columns from tablename

我有三个表,
图像
图标
,和
横幅
,每个表都有一个唯一的主键,主键也是自动递增的,分别命名为
图像id
图标id
,和
横幅id

我正在浏览上面的表格,我想知道是否有一种方法可以选择
id
列而不指定它的特定名称

差不多

SELECT PRIMARY_KEY
FROM {$table}

我不必更改我的表结构或使用
*
,因为会有很多数据要返回,并且会减慢我的应用程序的速度。

只需命名每个表中的id列
id
。保留外键的
任何id
命名

或者您可以使用标准SQL命令

show columns from tablename
它将显示PRI列


检查以了解更多信息

主键与包含主键的列不同。主键是放置在一个或多个列上的索引和约束,而不是列本身。您的伪代码查询:

SELECT PRIMARY_KEY
FROM tablename
相当于:

SELECT keyname
FROM tablename
这是无效的。您真正需要选择的是列,而不是键

遗憾的是,没有列别名或简单函数可用于指定具有主键约束的列。它很可能不可用,因为主键可以应用于多个列

要查看哪些列具有主键约束,可以通过查询模式表、使用
showcolumns
等来使用一些反射。。如果要假设第一列具有主键约束,只需执行
SELECT*fromtablename LIMIT 1
即可获得结果中的所有列名

当然,当您不知道列名时,您也可以选择*


如果您不想使用内置元数据或您自己的数据进行额外的查询来获取列名来构造查询,我会尽可能听从Marc B的回答。

我不是一个爱发光的人,但在我看来,您需要的是
信息模式

类似以下内容的查询:

SELECT     pk.table_name, column_name as 'primary_key'
FROM       information_schema.table_constraints pk 
INNER JOIN information_schema.key_column_usage C 
                                    on c.table_name = pk.table_name  and
                                       c.constraint_name = pk.constraint_name
where   constraint_type = 'primary key'
           -- and pk.table_name  LIKE '%whatever%'
SELECT {$PK_ColumnName}
FROM {$table}
上述查询(过滤到您需要的任何相关表集)将为您提供一个表名和相关主键的列表。您可以查询手头上的信息,例如:

SELECT     pk.table_name, column_name as 'primary_key'
FROM       information_schema.table_constraints pk 
INNER JOIN information_schema.key_column_usage C 
                                    on c.table_name = pk.table_name  and
                                       c.constraint_name = pk.constraint_name
where   constraint_type = 'primary key'
           -- and pk.table_name  LIKE '%whatever%'
SELECT {$PK_ColumnName}
FROM {$table}

注意,如果您有复合主键(即每个键有多个字段),则可能需要更复杂的语法和字符串生成器。此外,信息模式的查询成本相对较高,因此您可能希望缓存设置的结果,或者不经常查询它。

这是我命名字段的方式,但是,此应用程序中的现有查询将查找
任何id
,我认为我也无法说服我的主管重新构造我们的表。我必须在应用程序中使用一些PHP来提取该字段名。如果我能从$table中选择(显示图标中的列,其中Key='PRI')之类的内容,那将很好,但它返回整行,而不仅仅是正确的
字段,在PHP中,您将得到如下内容:for($j=0;$jIt可能不是很灵活,但如果只有3个表,则可以只使用一个函数或一个映射数组来获取pkname('images'))=='image\u id'等等。是的,考虑到我目前的情况,我可以只做一个
substr
来删除表名末尾的
s
,并将
\u id
连接到表名上。我只是想找一些比一个SQL语句更灵活的方法。据我所知,您还需要做一个额外的操作查询以获取名称(并使用PHP)。您可以考虑的是在第一次需要的时候抓取所有的主键名称并缓存它们。根据您的情况,这可能是可怕的性能,但它会保持相当灵活。