如何获取表的 PRIMARY KEY COLUMNS(在 COMPOSITE 主键的情况下)
Posted
技术标签:
【中文标题】如何获取表的 PRIMARY KEY COLUMNS(在 COMPOSITE 主键的情况下)【英文标题】:How to get PRIMARY KEY COLUMNS of a table (in case of COMPOSITE primary key) 【发布时间】:2013-09-02 06:31:32 【问题描述】:我有一个包含复合主键的表。
我正在对该表进行更新,并且在 where 子句中我需要主列的名称。 直到现在我一直在使用:
string sql = "SELECT PrimaryColumnName = col.column_name
FROM information_schema.table_constraints tc
INNER JOIN information_schema.key_column_usage col
ON col.Constraint_Name = tc.Constraint_Name
AND col.Constraint_schema = tc.Constraint_schema
WHERE tc.Constraint_Type = 'Primary Key'
AND col.Table_name = '" + TABLE NAME HERE + "'";
获取主键列。但是,如果主键是复合的,它就会失败。 我如何在这里进行更新? 帮助。
【问题讨论】:
请始终使用parameterized sql。这种字符串连接对SQL Injection 攻击开放。 【参考方案1】:以下查询将获取所有主键列:
SELECT c.Name
FROM [sys].[index_columns] ic
INNER JOIN [sys].[columns] c
ON ic.[object_id] = c.[object_id]
AND ic.[column_id] = c.[column_id]
INNER JOIN [sys].[indexes] i
ON i.[object_id] = ic.[object_id]
AND i.[index_id] = ic.[index_id]
WHERE i.is_primary_key = 1
AND ic.[object_id] = OBJECT_ID(@ObjectName);
Example on SQL Fiddle
正如评论中所述,您应该使用参数化查询。
【讨论】:
谢谢,我正用头撞墙寻找此信息【参考方案2】:使用命令对象将值作为参数传递给 SQL 语句,提供类型检查和验证
using (SqlConnection conn = new SqlConnection(sqlBuilder.ConnectionString))
string schemaName = "yourSchemaName";
string tableName = "yourTableName";
SqlCommand command = new SqlCommand(@"
SELECT column_name
FROM information_schema.key_column_usage
WHERE TABLE_SCHEMA = @schemaName AND TABLE_NAME = @tableName
AND OBJECTPROPERTY(object_id(constraint_name), 'IsPrimaryKey') = 1
ORDER BY table_schema, table_name", conn);
command.Parameters.Add("@schemaName", SqlDbType.VarChar, 100).Value = schemaName;
command.Parameters.Add("@tableName", SqlDbType.VarChar, 100).Value = tableName;
conn.Open();
SqlDataReader reader = command.ExecuteReader();
try
while (reader.Read())
Console.WriteLine(reader[0]);
finally
reader.Close();
【讨论】:
USE PARAMETERIZED QUERIES! 提倡使用String.Format
构建查询可不是什么好建议!此行 Console.WriteLine(String.Format("0", reader[0]));
也可以缩短为 Console.WriteLine(reader[0]);
@GarethD 说得好! String.Format 替换为 SqlParameter 对象。谢谢【参考方案3】:
选择表名 然后按 Alt+F1 您将获得所需的所有详细信息。
【讨论】:
【参考方案4】:您的查询似乎没问题。我已经对其进行了测试,它返回了包含主键的所有列。
尝试在 SSMS 中运行它,你会得到两个
CREATE TABLE dbo.T1
(
ID int NOT NULL,
SomeTextColumn nvarchar(30) NOT NULL,
SomeColumn nvarchar(20),
SomeOtherColumn uniqueidentifier,
CONSTRAINT [PK_T1] PRIMARY KEY CLUSTERED (ID, SomeTextColumn)
)
SELECT PrimaryColumnName = col.column_name
FROM information_schema.table_constraints tc
INNER JOIN information_schema.key_column_usage col ON col.Constraint_Name = tc.Constraint_Name
AND col.Constraint_schema = tc.Constraint_schema
WHERE tc.Constraint_Type = 'Primary Key' AND col.Table_name = 'T1'
这是一个SQL Fiddle 示例。
如果您需要按列过滤,您可以随时添加“and col.COLUMN_NAME = 'ID'”
【讨论】:
以上是关于如何获取表的 PRIMARY KEY COLUMNS(在 COMPOSITE 主键的情况下)的主要内容,如果未能解决你的问题,请参考以下文章
PostgreSQL:操作 PRIMARY KEY 列的类型